Re[13]: Мифический Haskell
От: vshabanov http://vshabanov-ru.blogspot.com
Дата: 24.02.12 19:05
Оценка: +2
Здравствуйте, m e, Вы писали:

ME>>>там четко написано "Portability : non-portable (GHC Extensions)", значит ты должен был ответить "мы говорим не о хаскеле, а о GHC Extensions" и не путать меня и окружающих


K>>Думаю, что окружающие в курсе, что "стандартный хаскель с расширениями" называется просто хаскель. А когда говорят о стандартном, всегда явно это указывают: haskell 98 или haskell 2010.


ME>очень, очень любопытно


ME>так хаскелем у тебя называется хаскель с какими расширениями? с расширениями любого из почти 10 компиляторов? или только с расширениями ghс? если так, то какого хрена такая дискриминация?


Учитывая, что ghc разрабатывается основным автором хаскелла и является по сути единственным активно используемым компилятором промышленного качества, то под хаскеллом обычно понимают текущую его реализацию в ghc (если только не говорят прямо haskell 98 / 2010).
Re[29]: Мифический Haskell
От: VoidEx  
Дата: 24.02.12 19:09
Оценка:
Здравствуйте, samius, Вы писали:

VE>>А ты ответь, что понимаешь под semantically observable.

S>Семантически обозримые эффекты — изменения, которые обнаружимы средствами языка. Типично для императивных языков — глобальные переменные, любые изменяемые состояния.

Ну осталось выяснить, что есть побочный эффект. Вывод строки функцией, единственной целью которой и является вывод строки, это побочный эффект или основной?
Re[30]: Мифический Haskell
От: samius Япония http://sams-tricks.blogspot.com
Дата: 24.02.12 19:12
Оценка:
Здравствуйте, VoidEx, Вы писали:

VE>Здравствуйте, samius, Вы писали:


VE>Ну осталось выяснить, что есть побочный эффект. Вывод строки функцией, единственной целью которой и является вывод строки, это побочный эффект или основной?

Основным эффектом вычисления функции является то, что она возвращает в качестве результата. Все остальное — побочный.
Re[31]: Мифический Haskell
От: VoidEx  
Дата: 24.02.12 19:13
Оценка:
Здравствуйте, samius, Вы писали:

VE>>Ну осталось выяснить, что есть побочный эффект. Вывод строки функцией, единственной целью которой и является вывод строки, это побочный эффект или основной?

S>Основным эффектом вычисления функции является то, что она возвращает в качестве результата. Все остальное — побочный.

Ну и putStrLn, например, возвращает IO (). Для входного "test" всегда один и тот же. Значит, функция чистая?
Re[32]: Мифический Haskell
От: samius Япония http://sams-tricks.blogspot.com
Дата: 24.02.12 19:16
Оценка:
Здравствуйте, VoidEx, Вы писали:

VE>Здравствуйте, samius, Вы писали:


S>>Основным эффектом вычисления функции является то, что она возвращает в качестве результата. Все остальное — побочный.


VE>Ну и putStrLn, например, возвращает IO (). Для входного "test" всегда один и тот же. Значит, функция чистая?

В точности так. одно и то же — значит детерминирована. Не портит окружающую среду при выполнении — значит без побочных эффектов. Чистая по формальному определению.
Re[33]: Мифический Haskell
От: VoidEx  
Дата: 24.02.12 19:24
Оценка:
Здравствуйте, samius, Вы писали:

VE>>Ну и putStrLn, например, возвращает IO (). Для входного "test" всегда один и тот же. Значит, функция чистая?

S>В точности так. одно и то же — значит детерминирована. Не портит окружающую среду при выполнении — значит без побочных эффектов. Чистая по формальному определению.

А о чём тогда спор?
Re[27]: Мифический Haskell
От: vshabanov http://vshabanov-ru.blogspot.com
Дата: 24.02.12 19:27
Оценка: +2
Здравствуйте, samius, Вы писали:

V>>Жалко, что ты не понимаешь моих объяснений )


S>Я их понимаю, я их не могу принять.


Так, похоже у нас просто разногласие в определениях.

Если считать, что ф-ия, занимающаяся внешним I/O, нечистая, то какая-нить getLine :: World -> (a, World) будет нечистой. Это твое мнение, исходящее из определения в википедии. Оке, при таком определении, getLine действительно нечистая.

Мое определение чистоты сильно короче. Чистая ф-ия возвращает один и тот же результат на одних и тех же аргументах. Всё. С таким определением getLine становится чистой, т.к. на одном и том же аргументе (мире, где пользователь вводит одну и ту же строку) ф-ия возвращает один и тот же результат, равно как и какой нить putLine на одом и том же мире и строке всегда возвращает один и тот же мир с добавленной строкой.

Т.е., если выбросить из определения детали про I/O, что, похоже, для тебя принципиально важно, то getLine чистая (мое мнение из моего определения чистоты), если же оставить, то грязная (твое мнение из твоего определения).

Идет?
Re[34]: Мифический Haskell
От: samius Япония http://sams-tricks.blogspot.com
Дата: 24.02.12 19:29
Оценка:
Здравствуйте, VoidEx, Вы писали:

VE>Здравствуйте, samius, Вы писали:


VE>>>Ну и putStrLn, например, возвращает IO (). Для входного "test" всегда один и тот же. Значит, функция чистая?

S>>В точности так. одно и то же — значит детерминирована. Не портит окружающую среду при выполнении — значит без побочных эффектов. Чистая по формальному определению.

VE>А о чём тогда спор?

Спор о чистоте действия, которое возвращает putStrLn.
Моя позиция заключается в том, что действие IO a в общем случае не чисто. Я не исключаю существования чистых IO a, но то что заворачивается в IO a, как правило носит нечистый характер.
Результат getChar :: IO Char недетерминирован, т.к. принимает символ извне
Результат putStrLn :: IO () имеет побочный эффект — портит консоль в реальном мире.

Владимир считает что действия чисты, т.к. работают с World, который якобы представляет собой отражение реального мира. И нечистота этих действий не интересует программу изнутри программы.
Re[28]: Мифический Haskell
От: samius Япония http://sams-tricks.blogspot.com
Дата: 24.02.12 19:36
Оценка:
Здравствуйте, vshabanov, Вы писали:

V>Здравствуйте, samius, Вы писали:


V>Так, похоже у нас просто разногласие в определениях.

Везет мне на разногласия в определениях.

V>Если считать, что ф-ия, занимающаяся внешним I/O, нечистая, то какая-нить getLine :: World -> (a, World) будет нечистой. Это твое мнение, исходящее из определения в википедии. Оке, при таком определении, getLine действительно нечистая.

(*)
все-таки getLine :: IO String является чистой.
А уж IO String, которая раскрывается в IO a :: World -> (a, World) нечистая. Мне кажется что ты понимаешь, о чем я, просто уточняю на всякий случай.

V>Мое определение чистоты сильно короче. Чистая ф-ия возвращает один и тот же результат на одних и тех же аргументах. Всё. С таким определением getLine становится чистой, т.к. на одном и том же аргументе (мире, где пользователь вводит одну и ту же строку) ф-ия возвращает один и тот же результат, равно как и какой нить putLine на одом и том же мире и строке всегда возвращает один и тот же мир с добавленной строкой.


Вот в этом и проблема. Это только твое определение, или кто-то еще им пользуется? На самом деле я на рсдн не первый раз встречаю форумчан с собственными определениями. И в отношении чистоты уже как минимум двое кроме тебя пользуются схожим с твоим определением чистоты. Но мне кажется что это неправильное определение, т.к. в литературе я его в таком виде не встречал.

V>Т.е., если выбросить из определения детали про I/O, что, похоже, для тебя принципиально важно, то getLine чистая (мое мнение из моего определения чистоты), если же оставить, то грязная (твое мнение из твоего определения).


V>Идет?

С поправкой выше (*) — идет.
Re[14]: Мифический Haskell
От: m e  
Дата: 24.02.12 20:11
Оценка: :)
V>Учитывая, что ghc разрабатывается основным автором хаскелла и является по сути единственным активно используемым компилятором промышленного качества, то под хаскеллом обычно понимают текущую его реализацию в ghc (если только не говорят прямо haskell 98 / 2010).

для обсуждения на форуме вполне нормально назвать хаскелем скажем ghc7-хаскель

но вот в качестве ответа на вопрос

ME>>ммм... а мы про хаскель говорим или про что?


называть хаскелем скажем ghc7-хаскель уже будет неверно

в мире с++ на аналогичный вопрос ответили бы "мы говорим о с++ с расширениями g++", а не "мы говорим о с++"; если бы кто-то начал выпендриваться, защищая название "с++" для g++, его бы быстро поставили на место

очень жаль, что такой дурной тон апологеты хаскеля пытаются защищать, забывая о стандартах

з.ы. "текущая" реализация -- это тоже недостаточно определенное понятие
Re[35]: Мифический Haskell
От: VoidEx  
Дата: 26.02.12 03:50
Оценка:
Здравствуйте, samius, Вы писали:

S>Спор о чистоте действия, которое возвращает putStrLn.


А какая разница? Хаскель от этого грязнее не становится. А World — это какое-то божество, в Haskell непредставимое, содержащее информацию обо всей вселенной. Ну и сколлапсирует ли волновая функция в одно и то же при одинаковых World — это лишь вопрос веры.
Re[36]: Мифический Haskell
От: samius Япония http://sams-tricks.blogspot.com
Дата: 26.02.12 18:30
Оценка:
Здравствуйте, VoidEx, Вы писали:

VE>Здравствуйте, samius, Вы писали:


S>>Спор о чистоте действия, которое возвращает putStrLn.


VE>А какая разница? Хаскель от этого грязнее не становится.

Разницы действительно никакой. И хаскель от этого не станет ни чище ни грязнее. Причем, позиция в этом вопросе никак качественно не повлияет на код реальных приложений. Это как в ситуации когда ОО-программисту с 15-летним стажем открывают глаза на тот факт что перегрузка методов тоже есть полиморфизм. Куча охов-ахов, флейма и т.п. Но по сути ничего не меняется.

VE>А World — это какое-то божество, в Haskell непредставимое, содержащее информацию обо всей вселенной. Ну и сколлапсирует ли волновая функция в одно и то же при одинаковых World — это лишь вопрос веры.

Не принимаю мистику в программировании. Я могу понимать что чего-то не понимаю, но заставлять себя думать что там божество не могу и не хочу. Тем более что в случае с World-ом — там лишь одна вывеска.
Re[14]: Мифический Haskell
От: Tonal- Россия www.promsoft.ru
Дата: 27.02.12 09:17
Оценка: +1
Здравствуйте, Klapaucius, Вы писали:

K>Нет. MigMit раньше исходил из ошибочного предположения, что в C++ есть параметрический полиморфизм. Но параметрический полиморфизм означает, что forall a. Box a описывает бесконечное кол-во типов. В C++ же кол-во типов всегда конечно, поэтому полиморфизм там только ad-hoc. Выяснив, как дела обстоят на самом деле, MigMit решил предостеречь остальных от следования предположению, которое на практике оказалось ошибочным.

В С++ количество описываемых шаблонами типов бесконечно. Но бесконечно только на этапе компиляции — именно в это время идут вычисления над типами.
На этапе же выполнения остаётся только код скомпилированный для конечного числа типов. Либо компиляция не завершается.
См. мой комментарий
Автор: Tonal-
Дата: 24.02.12
Re[15]: Мифический Haskell
От: Klapaucius  
Дата: 01.03.12 12:57
Оценка:
Здравствуйте, m e, Вы писали:

ME>*НО* при этом эмуляция зависимых типов параметрическим полиморфизмом -- это примерно как коленвал ДВС из дерева


Никакие зависимые типы тут не "эмулируются". Типы в этих примерах не зависят от значений.
И, разумеется, для решения реальных задач такое не часто используется. Но это ведь просто иллюстрация проблем, которые в других областях проявлятся будут. Как проблемы с раздельной компиляцией, например.
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Re[15]: Мифический Haskell
От: Klapaucius  
Дата: 01.03.12 12:57
Оценка:
Здравствуйте, Tonal-, Вы писали:

T>В С++ количество описываемых шаблонами типов бесконечно.


Это совсем не очевидно, скорее очевидно обратное. Число типов, описываемых шаблоном — это число инстанциаций шаблона с разными типами. Т.е. понятно, что с одинаковым кодом можно как-то бороться, но семантика именно такая — для каждого подстаялемого в шаблон типа — своя реализация. Т.е. это ad-hoc полиморфизм, а не параметрический.

T>Но бесконечно только на этапе компиляции — именно в это время идут вычисления над типами.

T>На этапе же выполнения остаётся только код скомпилированный для конечного числа типов. Либо компиляция не завершается.

Рантайм-то тут вообще причем? Обсуждаемые примеры работают на этапе компиляции, что на хаскеле — что на C#. Динамические возможности CLR используются в C# для генерации специализаций для анбоксед-типов (т.е. для оптимизации, на семантику это не влияет). В хаскеле и яве полиморфизм бывает только для боксед, но и тут есть некоторые обходные пути для оптимизации. Понятно, что C++ не может позволить себе полиморфизм ни ценой боксинга всего, ни ценой JIT. Потому-то там параметрического полиморфизма и нет.

T>См. мой комментарий
Автор: Tonal-
Дата: 24.02.12


Это вообще нерелевантно обсуждаемой теме. Мы говорим о случаях, когда все что нужно известно на этапе компиляции.
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Re[13]: Мифический Haskell
От: Klapaucius  
Дата: 01.03.12 12:57
Оценка:
Здравствуйте, m e, Вы писали:

ME>так хаскелем у тебя называется хаскель с какими расширениями?


Да почему у меня-то? Это позиция авторов языка изложенная в статье по истории разработки хаскеля. Хаскелем называется любое надмножество стандарта 98-го года. Если же речь идет о конкртеном стандарте, то это указывается явно. Но только речь о стандартах 98-го и 10-го года не идет почти никогда, кроме вот такого вот форумного диспута, потому что стандарты эти ни практического ни теоретического интереса не представляют.

ME> с расширениями любого из почти 10 компиляторов? или только с расширениями ghс? если так, то какого хрена такая дискриминация?


С расширениями актуальных версий любого из почти одного компилятора. Если речь пойдет о каком-то особенно новом расширении — укажут версию GHC, все расширения до 7.0 включительно подразумеваются по умолчанию. Это вообще характерно для языков с одной флагманской реализацией. Были, конечно, когда-то времена, когда было две используемых реализации (по той же причине что и у SML сейчас — в одной есть REPL, в другой — нормальный компилятор), но hugs умер где-то в 06-ом и теперь реализация одна (кое-как ведутся работы по превращению компилятора Clean в компилятор хаскеля, что, понятно, единственный шанс на выживание этого компилятора, но вероятность того, что эта реализация все-таки будет кем-то использоваться я считаю призрачной).
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Re[37]: Мифический Haskell
От: Klapaucius  
Дата: 01.03.12 12:57
Оценка:
Здравствуйте, samius, Вы писали:

S>Не принимаю мистику в программировании.


Тогда откуда это мистическое отличие необнаруживаемого из программы сайд-эффекта с изменением файла от сайд-эффекта с нагревом процессора?
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Re[38]: Мифический Haskell
От: samius Япония http://sams-tricks.blogspot.com
Дата: 01.03.12 13:02
Оценка:
Здравствуйте, Klapaucius, Вы писали:

K>Здравствуйте, samius, Вы писали:


S>>Не принимаю мистику в программировании.


K>Тогда откуда это мистическое отличие необнаруживаемого из программы сайд-эффекта с изменением файла от сайд-эффекта с нагревом процессора?

Из определения чистоты.
Re[39]: Мифический Haskell
От: Klapaucius  
Дата: 01.03.12 13:22
Оценка:
Здравствуйте, samius, Вы писали:

K>>Тогда откуда это мистическое отличие необнаруживаемого из программы сайд-эффекта с изменением файла от сайд-эффекта с нагревом процессора?

S>Из определения чистоты.

И где в этом определении описано, почему одни ненаблюдаемые сайд-эффекты равнее других? По моему, когда говорят о сайд-эффектах, имеют в виду наблюдаемые, с помощью которых можно ссылочную прозрачность нарушить. А ненаблюдаемые сайд-эффекты у любой функции есть.
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Re[40]: Мифический Haskell
От: samius Япония http://sams-tricks.blogspot.com
Дата: 01.03.12 13:50
Оценка:
Здравствуйте, Klapaucius, Вы писали:

K>Здравствуйте, samius, Вы писали:


K>>>Тогда откуда это мистическое отличие необнаруживаемого из программы сайд-эффекта с изменением файла от сайд-эффекта с нагревом процессора?

S>>Из определения чистоты.

K>И где в этом определении описано, почему одни ненаблюдаемые сайд-эффекты равнее других? По моему, когда говорят о сайд-эффектах, имеют в виду наблюдаемые, с помощью которых можно ссылочную прозрачность нарушить. А ненаблюдаемые сайд-эффекты у любой функции есть.

В определениях не пишут "почему". В определениях пишут о том, что является определяемым понятием, а что — нет. Функции с вводом выводом чистыми не являются по определению.
А вот то, греет функция с вводом выводом процессор, или нет, однозначно и не разобрать. Вполне может и остужать.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.