LINUX.ORG.RU

[FP] Помогите с выбором языка для ФП


0

4

Здравствуйте, пожалуйста порекомендуйте какой язык выбрать из списка и по возможности книгу/туториал по нему, скажите какие у него перед остальными плюсы: - Erlang - Scala - Clojure - Scheme - OCaml Или что-то другое. Python не предлагать, как впрочем и Haskell. Если язык не из списка - то интересует именно инопланетный синтаксис и возможность писать на чистом ФП. Желательно, чтобы язык был не чисто академическим, имелась возможность работы с тулкитами (Qt, GTK, Tk).

Изучать собрался пока ради удовольствия, потом буду использовать в работе и реализации пары OpenSource проектов «для себя». Заранее спасибо.

p.s.: А Refal еще жив? Может он шевелится и имеет связки с тулкитами и прочим?


Ответ на: комментарий от winduzyatnik

А нужна она для того чтобы зафиксировать порядок вычислений и не потерять вызовы функций. Это ее прямое и единственное предназначение.

Нет, для этого достаточно композиции функций.

Ввели эту абстракцию для того же, для чего в своё время ввели циклы и ветвления, когда все пользовались условными джампами на метку. Более высокоуровневая конструкция.

Miguel ★★★★★
()
Ответ на: комментарий от winduzyatnik

Я показал, как реализовать полноценное IO.

Нет, не показал.

При твоём подходе возникнут большие проблемы с многопоточностью. Как их решали авторы ghc - я, честно говоря, не знаю. В моей реализации проблемы не будет.

Miguel ★★★★★
()
Ответ на: комментарий от Miguel

>Есть. За каким хреном ты это всё писал?

Проверка на вшивость. Зануда тест провалил с треском. Он даже не понял что я написал полноценную реализацию IO.

winduzyatnik
()
Ответ на: комментарий от Miguel

>Нет, для этого достаточно композиции функций.

Ага, конечно.

Вот тебе функция:

writeLine :: String -> ()

Как ты собрался затавить хаскель ее не выкинуть учитывая что он знает что тип () имеет одно значение.

winduzyatnik
()
Ответ на: комментарий от Miguel

При твоём подходе возникнут большие проблемы с многопоточностью. Как их решали авторы ghc - я, честно говоря, не знаю. В моей реализации проблемы не будет.

Хм. Я уже далеко не первый год пишу многопоточный код. Где ты там увидил проблемы мне не ясно совершенно.

winduzyatnik
()
Ответ на: комментарий от LongLiveUbuntu

>F#

Не нужен.

Его единственное преимущество перед немерле то что его делает и продвигает мелкософт. Как язык он сливает с таким треском, что даже не смешно.

winduzyatnik
()
Ответ на: комментарий от winduzyatnik

> Как ты собрался затавить хаскель ее не выкинуть учитывая что он знает что тип () имеет одно значение.

Функция вообще-то вот такая: writeLine :: String -> IO ()

Да, у нее одно значение - вычисление, которое выводит string (можешь считать для простоты, что эта ф-я возвращает лямбду, которая принимает стринг и выводит на экран). Его эта функция и возвращает. Всегда. Что и где тут должно выкидываться? Ты никак не можешь понять основной вещи - программа на хаскеле ничего не делает. Она не принимает ничего из входного порта и не выводит на выходной. В хаскеле вообще нету средств, которые бы позволили произвести сайд-эффекты или работать с world'ом. Любая программа на хаскелле возвращает некоторое _вычисление_, причем она получает это вычисление еще на этапе компиляции - потому что все данные известны на этапе компиляции. Дальше хаскель заканчивается - у нас есть некоторое _вычисление_ и все. Мы потом это _вычисление_ скармливаем некоему компилятору/интерпретатору и он его уже выполняет, но этот компилятор/интерпретатор уже сам к хаскелю никакого отношения не имеет. На самом деле его может и вовсе не быть. Программа на хаскелле согласно стандарту должна вернуть вычисление, но не обязана его выполнять вообще.

anonymous
()
Ответ на: комментарий от anonymous

>Функция вообще-то вот такая: writeLine :: String -> IO ()

Вообщето мне тут втирали что композиции достаточно. Поэтому я написал именно тут сигнатуру что написал. Вот пусть за слова и отвечают.

А что из себя представляет хаскель я понимаю лучше всех вас вместе взятых.

Просто по тому, что я анализирую не только то, что сделано, но и то _почему_ это сделано.

winduzyatnik
()
Ответ на: комментарий от winduzyatnik

> Поэтому я написал именно тут сигнатуру что написал.

Только при чем тут хаскель? В нем ведь сигнатура другая.

Просто по тому, что я анализирую не только то, что сделано, но и то _почему_ это сделано.

Так ты до начала разбора «как», разбересь с тем, «что». ИО семантически не имеет отношения к порядку выполнения, сайдэффектам ворлду и т.п.. То, что инкапсулированное в ИО вычисление выполняется на некоем астральном интерпретаторе, который нам дает боженька - это просто такой очень удачный факт. Сам этот интерпретатор не имеет отношения к хаскелю. ИО в самом хаскеле никак не определена, известно только, что это такая монада. Ты можешь в своем астральном интерпретаторе сделать ИО = List, это все еще будет хаскель. То есть из всех монад есть некоторая выделенная монада ИО, никак не специфицированная. И программа на хаскелле должна вернуть именно эту монаду. Все.

anonymous
()
Ответ на: комментарий от anonymous

>Только при чем тут хаскель? В нем ведь сигнатура другая.

При том что было утверждение что композиции достаточно.

Так ты до начала разбора «как», разбересь с тем, «что».

Я понимаю «как». Я понимаю «что». И в отличии от всех вас я понимаю «почему». А «почему» гораздо важнее чем «как» и «что»

А то что ты мне тут пишешь я уже не один год знаю.

winduzyatnik
()
Ответ на: комментарий от winduzyatnik

> При том что было утверждение что композиции достаточно.

Да, достаточно. Как твой пример это опровергает? Дело не в ИО, а в том, что возвращаемый тип должен быть монадическим, то есть m () для любой монады m. Если () имеет одно значение - это не значит, что m () имеет одно значение. пример - List (). ИО тут не уникальна, это общий принцип.

Я понимаю «как». Я понимаю «что».

Нет, не понимаешь.

И в отличии от всех вас я понимаю «почему».

Нет, естественно. Ты же отборную чушь несешь.

А «почему» гораздо важнее чем «как» и «что»

нельзя понимать «почему», не понимая «что». Разберись сначала с основами, потом уже углубляйся.

А то что ты мне тут пишешь я уже не один год знаю.

Если бы знал - не нес бы чуши.

anonymous
()
Ответ на: комментарий от winduzyatnik

> При том что было утверждение что композиции достаточно.

Да, вот, кстати. do-нотация работает для любой монады и она фиксирует порядок вычисления. Безо всяких ИО. Через композицию, в которую do-нотация и раскрывается. Что на это скажешь?

anonymous
()
Ответ на: комментарий от winduzyatnik

Вообще-то я отлично понимаю, что ты там написал. И подтверждением тому является мой ответ. http://www.linux.org.ru/jump-message.jsp?msgid=6094429&cid=6107703 А так же мой пост до этого про World. http://www.linux.org.ru/jump-message.jsp?msgid=6094429&cid=6100145

И причем, в отличии от тебя, я даже прекрасно представляю, что твой unsafeReadLine — это CAF, который компилятор может вычислить ровно один раз и потом возвращать одно и то же значение на каждое обращение к readLine.

Тебе уже 4 страницы много различных людей объясняют простые вещи, а ты даже не пытаешься понять, о чем тебе говорят. Это по причине твоего скудоумия?

sanuda
()
Ответ на: комментарий от winduzyatnik

> А что из себя представляет хаскель я понимаю лучше всех вас вместе взятых.

Судя по всему, хуже каждого из отметившихся в треде.

Просто по тому, что я анализирую не только то, что сделано, но и то _почему_ это сделано.

То есть для оценки инструмента ты пользуешься историческими фактами? Хорошо, что таких кретинов единицы.

sanuda
()
Ответ на: комментарий от anonymous

Скажу, что ты разговариваешь с человеком, который делал для одного из языков сахар аналогичный do нотации и несколько монад для использования совместно с этим сахаром.

Если бы я не понимал «что» и «как» я не смог бы это сделать.

Если бы я не понимал «почему» я не стал бы это делать.

winduzyatnik
()
Ответ на: комментарий от winduzyatnik

> Я уже далеко не первый год пишу многопоточный код. Где ты там увидил проблемы мне не ясно совершенно.

Эти проблемы решены не тобой. Ты просто не способен на такое.

sanuda
()
Ответ на: комментарий от sanuda

>Эти проблемы решены не тобой. Ты просто не способен на такое.

Ну так ты мне покажи хоть одну проблему.

winduzyatnik
()
Ответ на: комментарий от sanuda

>То есть для оценки инструмента ты пользуешься историческими фактами? Хорошо, что таких кретинов единицы.

Ну то есть создатели хаскеля идиоты и добавили монаду IO просто чтобы было круто?

winduzyatnik
()
Ответ на: комментарий от winduzyatnik

> делал для одного из языков сахар аналогичный do нотации и несколько монад для использования совместно с этим сахаром.

Ни то, ни другое понимания ИО не добавит. Первое (do-нотация) вообще не имеет никакого отношения к монадам, второе (понимание того, что такое монада вообще) не имеет отношения конкретно к тому, что такое ИО. Для понимания ИО нужно понимать семантику хаскеля (да - не только на уровне «что», но так же на уровне «как» и «почему»), а ее ты не понимаешь совершенно.

anonymous
()
Ответ на: комментарий от winduzyatnik

> Ну то есть создатели хаскеля идиоты и добавили монаду IO просто чтобы было круто?

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

anonymous
()
Ответ на: комментарий от anonymous

>ИО - это лучший из существующих на данный момент способов для контроля за сайдэффектами.

1)Это побочный эффект.

2)Не лучший. Ибо везде где есть IO можно делать что угодно. Попробуйка одним IO запретить плагину открывать файлы за приделами некой директории. Учти что хардкодить файловые операции в IO нельзя. Ибо IO универсальный механизм.

winduzyatnik
()
Ответ на: комментарий от anonymous

>Для понимания ИО нужно понимать семантику хаскеля (да - не только на уровне «что», но так же на уровне «как» и «почему»), а ее ты не понимаешь совершенно.

Где уж нам сирым. Особенно учитывая, что одна из монад занимается асинхронными вычислениями вообще и асинхронными IO в частности.

winduzyatnik
()
Ответ на: комментарий от winduzyatnik

>> ИО - это лучший из существующих на данный момент способов для контроля за сайдэффектами.

1)Это побочный эффект.

Побочный эффект чего? Чистоты языка? Тогда я только за.

2)Не лучший. Ибо везде где есть IO можно делать что угодно. Попробуйка одним IO запретить плагину открывать файлы за приделами некой директории. Учти что хардкодить файловые операции в IO нельзя. Ибо IO универсальный механизм.

Для этого в хаскелле есть класс MonadIO, позволяющий работать с подмножеством IO. Хотя, конечно, разделение IO по видам побочных эффектов пошло бы только на пользу.

exlevan
()
Ответ на: комментарий от exlevan

>Побочный эффект чего? Чистоты языка? Тогда я только за.

Побочный эффект борьбы с с тем что компилятор как попало может переставлять, а то и просто не вызывать функции ввода/вывода.

А вводу/выводу нужен строгий порядок.

Для этого в хаскелле есть класс MonadIO, позволяющий работать с подмножеством IO. Хотя, конечно, разделение IO по видам побочных эффектов пошло бы только на пользу.

Ты не понял.

У тебя есть программа.

У программы есть плагины. Plugin1, Plugin2 и Plugin3.

Есть папочка MyAppData в ней папочка Plugins, а в ней 3 папочки Plugin1, Plugin2 и Plugin3.

Все плагины работают в одном процессе. Так что средствами ОС ничего не сделать.

Задача номер раз: ограничить файловое IO плагинов их персональными папочками.

Задача номер два: Разрешить плагину Plugin2 только HTTP соединения. Те не голый сокет на 80й порт, а чтобы работали только http соиденения. Остальным запретить всю сетевую активность.

Одним IO тут не справиться.

winduzyatnik
()
Ответ на: комментарий от winduzyatnik

> 1)Это побочный эффект.

Нет, это не побочный эффект.

2)Не лучший.

Альтернатива?

Ибо везде где есть IO можно делать что угодно.

При чем тут что можно делать? Я же тебе ясно объяснил - это не механизм _реализации_ сайдэффектов, это механизм _контроля_ за ними. Который позволяет отделить чистый код от грязного. Приводи альтернативы давай.

anonymous
()
Ответ на: комментарий от winduzyatnik

> Особенно учитывая, что одна из монад занимается асинхронными вычислениями вообще и асинхронными IO в частности.

И? Это все равно тебе понимания ИО не добавило, как показывает текущий тред. Как ты не понимал почему ИО ввели в хаскель - так и не понимаешь.

anonymous
()
Ответ на: комментарий от winduzyatnik

> Побочный эффект борьбы с с тем что компилятор как попало может переставлять, а то и просто не вызывать функции ввода/вывода.

Тебе уже сто раз объяснили, что порядок вычисления фиксируется без ИО, он фиксируется при помощи композиции. Пример - применение do-нотации в других (не ИО) монадах. Там фиксируется порядок вычислений но без всяких ИО.

Одним IO тут не справиться.

Вопрос - при чем тут ИО вообще? У тебя просто талант пиздеть не по делу.

anonymous
()
Ответ на: комментарий от winduzyatnik

>> Побочный эффект чего? Чистоты языка? Тогда я только за.

Побочный эффект борьбы с с тем что компилятор как попало может переставлять, а то и просто не вызывать функции ввода/вывода.

Не функции, а действия ввода-вывода. Разумеется, для отдельного понятия нужна отдельная сущность, IO.

Для этого в хаскелле есть класс MonadIO, позволяющий работать с подмножеством IO.

Пардон, глупость написал. Любое IO в MonadIO доступно через liftIO.

Ты не понял.

Задача номер раз: ограничить файловое IO плагинов их персональными папочками.

Задача номер два: Разрешить плагину Plugin2 только HTTP соединения. Те не голый сокет на 80й порт, а чтобы работали только http соиденения. Остальным запретить всю сетевую активность.

Одним IO тут не справиться.

Лучше всего, чтобы плагины IO вообще не использовали, а использовали чистый интерфейс. А IO фильтровать до подключения плагинов.

exlevan
()
Ответ на: комментарий от anonymous

>Вопрос - при чем тут ИО вообще? У тебя просто талант пиздеть не по делу.

Вот и я удивляюсь какое отношение имеет IO к контролю побочных эффектов если оно их толком проконтролировать не может.

И в тоже время порядок побочных эффектов IO отлично фиксирует.

winduzyatnik
()
Ответ на: комментарий от exlevan

>Не функции, а действия ввода-вывода. Разумеется, для отдельного понятия нужна отдельная сущность, IO.

Ну то есть возражений о том что IO борется с переупорядочиванием побочных эффектов нет.

Уже прогресс.

Лучше всего, чтобы плагины IO вообще не использовали, а использовали чистый интерфейс. А IO фильтровать до подключения плагинов.

Те если IO не может обеспечить функционал, то к черту функционал... замечательная логика. Мне нравиться.

winduzyatnik
()
Ответ на: комментарий от winduzyatnik

>> Не функции, а действия ввода-вывода. Разумеется, для отдельного понятия нужна отдельная сущность, IO.

Ну то есть возражений о том что IO борется с переупорядочиванием побочных эффектов нет.

Уже прогресс.

Как можно бороться с тем, чего нет? Разумеется, при создании значения IO порядок действий ввода-вывода чётко определён.

Лучше всего, чтобы плагины IO вообще не использовали, а использовали чистый интерфейс. А IO фильтровать до подключения плагинов.

Те если IO не может обеспечить функционал, то к черту функционал... замечательная логика. Мне нравиться.

goto — тоже функционал. Иногда есть весомые причины избегать некоторых вещей.

exlevan
()
Ответ на: комментарий от exlevan

>Как можно бороться с тем, чего нет? Разумеется, при создании значения IO порядок действий ввода-вывода чётко определён.

Он что святым духом определен или свойствами монады IO?

goto — тоже функционал. Иногда есть весомые причины избегать некоторых вещей.

Любую программу с goto можно переписать с использованием хвостовых вызовов простейшим алгоритмом:

1) Превращаем все циклы в груду условных и безусловных переходов.

2) Разбиваем код на блоки, которые начинаются меткой и заканчиваются условным или безусловным переходом.

3) Каждый блок делаем отдельной функцией.

4) Если переход был безусловный, то в конце функции просто ставим вызов соответствующей функции. Если переход был условный, то ставим if then else с соответствующими вызовами.

Вывод: хвостовые вызовы зло. Я тебя правильно понял?

В любом случае тут совершенно другое дело, а ты просто пытаешься выкрутиться.

winduzyatnik
()
Ответ на: комментарий от winduzyatnik

>> Как можно бороться с тем, чего нет? Разумеется, при создании значения IO порядок действий ввода-вывода чётко определён.

Он что святым духом определен или свойствами монады IO?

Некоторыми дополнительными свойствами, которыми IO обладает по сравнению с остальными монадами.

Любую программу с goto можно переписать с использованием хвостовых вызовов

Ты не захочешь её отлаживать. goto ведь зло не потому, что оно называется goto.

В любом случае тут совершенно другое дело, а ты просто пытаешься выкрутиться.

Это обусловлено постановкой задачи. Если чего-то хочется, ещё не значит, что так лучше.

exlevan
()
Ответ на: комментарий от exlevan

>Некоторыми дополнительными свойствами, которыми IO обладает по сравнению с остальными монадами.

Какими еще дополнительными свойствами?

Ты не захочешь её отлаживать. goto ведь зло не потому, что оно называется goto.

goto замечательная штука. Если использовать к месту. Но эта твоя демагогия тут полный оффтопик.

Это обусловлено постановкой задачи. Если чего-то хочется, ещё не значит, что так лучше.

Постановку задачи в студию.

winduzyatnik
()
Ответ на: комментарий от winduzyatnik

> Вот и я удивляюсь какое отношение имеет IO к контролю побочных эффектов если оно их толком проконтролировать не может

Как это не может, если может и прекрасно контролирует?

И в тоже время порядок побочных эффектов IO отлично фиксирует.

Его фиксирует композиция, а не ИО.

anonymous
()
Ответ на: комментарий от winduzyatnik

> Ну то есть возражений о том что IO борется с переупорядочиванием побочных эффектов нет.

Нельзя боротсья с тем, чего нет.

Те если IO не может обеспечить функционал, то к черту функционал... замечательная логика. Мне нравиться.

А почему ИО должна обеспечивать функционал, который никак не онтосится к той области, для контроля которой введена ИО? Или, перефразируя - почему ИО должна соответствовать твоим мокрым фантазиям?

anonymous
()
Ответ на: комментарий от exlevan

> Любую программу с goto можно переписать с использованием хвостовых вызовов

Полнейшая чушь. Набрался баззвордов, а смысла не понимаешь.

anonymous
()
Ответ на: комментарий от winduzyatnik

> Каждый блок делаем отдельной функцией.

Бедняга, тем ведь даже в голову не пришло, что блоки могут быть вложенными. Так?

anonymous
()
Ответ на: комментарий от winduzyatnik

>> Некоторыми дополнительными свойствами, которыми IO обладает по сравнению с остальными монадами.

Какими еще дополнительными свойствами?

Операционной семантикой, зафиксированной стандартом языка. Согласно которой, компилятор заменяет значения IO кодом, выполняющим ввод/ввывод.

Ты не захочешь её отлаживать. goto ведь зло не потому, что оно называется goto.

goto замечательная штука. Если использовать к месту. Но эта твоя демагогия тут полный оффтопик.

Если под использованием к месту понимается обход недостатка выразительных средств отдельно взятых языков программирования, то да, замечательная. Не оффтопик, я приводил аналогию плохих практик программирования. В Си это goto, в хаскелле — IO не к месту.

exlevan
()
Ответ на: комментарий от winduzyatnik

> Он что святым духом определен или свойствами монады IO?

Он определен порядком вызова ф-й, которой жестко задан их композицией.

[1] ++ [2] ++ [3] получился список [1,2,3] чем в этом списке определен порядок элементов? ИО - это такая же последовательность вычислений и firstComputation >> secondComputation - вычисление, в котором выполняется сперва firstcomputation, а потом secondComputation точно так же, как [1] ++ [2] список, у которого первый элемент - единица, а второй - двойка. Если списки в этом плане не отличаются от ИО, то, выходит, ИО - тоже какая-то особая монада, работа которой определена святым духом?

anonymous
()
Ответ на: комментарий от anonymous

> ИО - тоже какая-то особая монада, работа которой определена святым духом?

список - тоже какая-то особая монада, работа которой определена святым духом? selffix

anonymous
()
Ответ на: комментарий от winduzyatnik

>> Это обусловлено постановкой задачи. Если чего-то хочется, ещё не значит, что так лучше.

Постановку задачи в студию.

Контроль над вводом/выводом в плагинах, которым был предоставлен интерфейс IO, если я правильно понял. Моё мнение — если плагины нужно контролировать, то предоставление им IO — уже ошибка.

exlevan
()
Ответ на: комментарий от anonymous

>Бедняга, тем ведь даже в голову не пришло, что блоки могут быть вложенными. Так?

Ты программы на ассемблере видел? Вложенные блоки в коде на ассемблере видел? А про то, что любая Сишная программа легко транслируется в ассемблер, знаешь?

Короче ты слился с треском.

winduzyatnik
()
Ответ на: комментарий от exlevan

>Операционной семантикой, зафиксированной стандартом языка. Согласно которой, компилятор заменяет значения IO кодом, выполняющим ввод/ввывод.

Чего?

when :: bool -> IO () -> IO () when b f = if b then f else return ()

На какой ввод/вывод будет заменена функция when?

winduzyatnik
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.