LINUX.ORG.RU

История изменений

Исправление quasimoto, (текущая версия) :

буду парсить?

Это многократный вызов f someValue, f anotherValue и т.д. для некоторого сгенерированного набора значений, с проверкой что все вызовы возвращают одно и то же для одинаковых аргументов — если да, то тест пройден и функция скорее всего чистая, если нет — она точно грязная. И run не нужен, bind делает внутри тот же run, его достаточно, картинка, ещё напоминаю про readLn >>= f >>> print. Ну и run тоже как бы есть (unsafePerformIO это стандарт, http://stackoverflow.com/a/3124722, а в GHC вовсе можно сделать import GHC.Types и делать с IO что хочешь).

Она принимает ссылки на инты, а возвращает структуру.

Это ссылки на функции, а не на инты. И что значит неправильная? Одни и те же функции — одна и та же по значению структура.

То есть хаскель - грязный язык?

То есть хаскель это язык в котором явно разделены два слоя — слой чистых функций и слой нечистых, из первого можно попасть во второй, но не наоборот, кроме как с помощью unsafePerformIO (см. выше на SO картинку), семантика должна быть полной и говорить нужно не только о том как хаскель транслируется в core (ну серьёзно — почему не прицепиться к С, мол, у него семантики нет, он в непонятно что транслируется, ассемблеров много, или вообще может интерпретироваться на PHP, вместо pure/unpure можно привязаться к const/non-const — те тоже два слоя с погружением в одну сторону и небезопасными кастами в другую, также можно ноги отстрелить), а о том что вообще происходит, в смысле эффектов и значений которые мы получим при выполнении и того как программы конкретно работают. Это не то чтобы «договорились», просто без всяких реализаций ясно, что любой корректной программе на хаскеле соответствует вполне однозначные результаты и эффекты, а если брать что-то вроде STG, то и исполнение.

Еще раз - семантика хаскеля заканчивается на генерации IO.

Как-то если посмотреть на публикации (Moggi, Gordon, Swierstra, SPJ на тему STG — посмотри, там мотивация не только в необходимости этого для реализации, но и для операционной семантики) — ни у кого ничего не заканчивается.

Исходная версия quasimoto, :

буду парсить?

Это многократный вызов f someValue, f anotherValue и т.д. для некоторого сгенерированного набора значений, с проверкой что все вызовы возвращают одно и то же для одинаковых аргументов — если да, то тест пройден и скорее всего чистая, если нет — она точно грязная. И run не нужен, bind делает внутри тот же run, его достаточно, картинка, ещё напоминаю про readLn >>= f >>> print. Ну и run тоже как бы есть (unsafePerformIO это стандарт, http://stackoverflow.com/a/3124722, а в GHC вовсе можно сделать import GHC.Types и делать с IO что хочешь).

Она принимает ссылки на инты, а возвращает структуру.

Это ссылки на функции, а не на инты. И что значит неправильная? Одни и те же функции — одна и та же по значению структура.

То есть хаскель - грязный язык?

То есть хаскель это язык в котором явно разделены два слоя — слой чистых функций и слой нечистых, из первого можно попасть во второй, но не наоборот, кроме как с помощью unsafePerformIO (см. выше на SO картинку), семантика должна быть полной и говорить нужно не только о том как хаскель транслируется в core (ну серьёзно — почему не прицепиться к С, мол, у него семантики нет, он в непонятно что транслируется, ассемблеров много, или вообще может интерпретироваться на PHP, вместо pure/unpure можно привязаться к const/non-const — те тоже два слоя с погружением в одну сторону и небезопасными кастами в другую, также можно ноги отстрелить), а о том что вообще происходит, в смысле эффектов и значений которые мы получим при выполнении и того как программы конкретно работают. Это не то чтобы «договорились», просто без всяких реализаций ясно, что любой корректной программе на хаскеле соответствует вполне однозначные результаты и эффекты, а если брать что-то вроде STG, то и исполнение.

Еще раз - семантика хаскеля заканчивается на генерации IO.

Как-то если посмотреть на публикации (Moggi, Gordon, Swierstra, SPJ на тему STG — посмотри, там мотивация не только в необходимости этого для реализации, но и для операционной семантики) — ни у кого ничего не заканчивается.