LINUX.ORG.RU

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


0

4

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

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

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


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

>> Значение типа «World»

Нет никаких значений типа «World». Не путай хаскель с клином, это разные языки.

То есть Haskell wiki неправильно объясняет?

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

Собственно, если бы ты сделал попытку прочесть то, на что ссылаешься, ты бы увидел:

The following text is an attempt to explain the details of Haskell I/O implementations.

и

my explanation shows only one _possible_ way to implement the IO monad in Haskell. For example, the hbc Haskell compiler implements IO monad via continuations.

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

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

вот простая иллюстрация:

Prelude> print "hi" `seq` ()
()
unC0Rr ★★★★★
()
Ответ на: комментарий от tailgunner

То есть Haskell wiki неправильно объясняет?

Если ты опять про IO_inside, то у меня пальцы скоро отвалятся повторять, что там описана ОДНА из ВОЗМОЖНЫХ реализаций.

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

Ну пусть не f = 1, пусть f = take 100500 [0..], не важно. В чём отличие от функции? Мне просто казалось что в haskell нет разницы между константой и функцией.

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

На тип посмотри. Функция имеет тип a -> b, для каких-то a и b.

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

>Попробуй, запусти ghci и набери :i RealWorld, и убедись, что такого типа в Хаскеле НЕТ.

Конечно его там нет. А знаешь по чему?

По тому что в этом случае его можно будет достать из монады IO. И порушить всю систему.

Вся философия монады IO построена на том что на вход мы получаем начальное состояние мира. В процессе мы его трансформируем, а на выходе получаем конечное состояние мира.

Данный финт ушами позволяет притворяться что программа на хаскеле чистая. Но это все не более чем лицемерие.

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

>> То есть Haskell wiki неправильно объясняет?

Если ты опять про IO_inside

Я первый раз %) Но да, я о ней.

там описана ОДНА из ВОЗМОЖНЫХ реализаций.

Если верить этой статье:

first, the IO monad understanding you've just acquired will work with any implementation and with many other monads. You just can't work with RealWorld values directly.

Second, the IO monad implementation described here is really used in the GHC, yhc/nhc (Hugs/jhc, too?) compilers.

Так что я не понимаю возмущения словами вендузятнега - он всё правильно сказал.

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

Хм. Я кажется не учел эти ваши «Ленивые вычисления».

Но почему этот код тогда выдает две строки «qwe»: http://ideone.com/MCRh8

А если раскомментировать закомментированную строку то будет «qwe asd». Что странно, ведь объект «IO String» остается прежним.

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

Хм. Я кажется не учел эти ваши «Ленивые вычисления».

Но почему этот код тогда выдает две строки «qwe»: http://ideone.com/MCRh8

А если раскомментировать закомментированную строку то будет «qwe asd». Что странно, ведь объект «IO String» остается прежним.

новый name скрывает предыдущий, лень тут ни при чём.

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

[qoute]Так что я не понимаю возмущения словами вендузятнега - он всё правильно сказал.

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

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

> Вендузятнег считает реализацию компилятора частью стандарта языка

Вендузятнег считает, что ввод-вывод реализован в Хаскеле с помощью трюков на грани мошенничества (или за гранью, не уверен). Судя по:

The Yhc/nhc98 implementation

data World = World
newtype IO a = IO (World -> Either IOError a)

This implementation makes the «World» disappear somewhat, and returns Either a result of type «a», or if an error occurs then «IOError». The lack of the World on the right-hand side of the function can only be done because the compiler knows special things about the IO type, and won't overoptimise it.

я склонен с ним согласиться.

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

ввод-вывод реализован в Хаскеле с помощью трюков на грани мошенничества

ключевое слово - реализован; с точки зрения программиста ничего предосудительного нет

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

Конечно его там нет. А знаешь по чему?

Знаю. («Почему» пишется слитно). Потому что это детали реализации. Никому не интересные.

Вся философия монады IO

...никому не интересна. Мы обсуждаем программирование, а не философию.

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

Ещё раз, это детали реализации, которые с чистой математикой, лежащей в основе хаскеля, ничего общего не имеют. Ввод/вывод вообще никак в самом хачкеле не реализован, вся программа состоит из конструирования значения main с чистым типом IO (). Да, то что делает с этим значением потом компилятор, было бы хаком и костылём, быдь это хаскель. Но это уже нечто другое, не чистое, умеющее ввод/вывод и т. д.

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

understanding ... will work

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

the IO monad implementation described here is really used in the GHC, yhc/nhc (Hugs/jhc, too?) compilers.

И там же про то, что другие компиляторы используют другие реализации. Что на самом деле не имеет отношения к дискуссии: как оно там унутре реализовано - вопрос глубоко шестнадцатый.

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

Это всё равно, что говорить, что ассемблерные вставки в Сях — это костыль и трюк на грани мошенничества.

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

А если раскомментировать закомментированную строку то будет «qwe asd». Что странно, ведь объект «IO String» остается прежним.

Ну, начнём с того, что, раскомментировав строчку, ты перекрываешь переменную. «name» из четвёртой строчки - это ДРУГАЯ переменная. Это так, для справки.

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

ввод-вывод реализован в Хаскеле с помощью трюков на грани мошенничества

В Хаскеле или в компиляторах Хаскеля?

Если второе - то это не наши проблемы. Первое же неверно.

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

Кстати, я выше по топику привёл ещё один возможный подход к реализации IO.

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

> А немерле может обращаться ко все .НЕТным либам.

со скалой согласен, а .нет не нужен сам-понимаешь-почему

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

> Данный финт ушами позволяет притворяться что программа на хаскеле чистая. Но это все не более чем лицемерие.

Спасибо, посмеялся. С такой логикой ФП вообще невозможно. Ведь в любом случае за кулисами языковых средств идет активная работа с состоянием оперативной памяти, кучи всевозможных «inc eax». А все эти ваши ФП — это не более, чем лицемерие.

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

>Вендузятнег считает, что ввод-вывод реализован в Хаскеле с помощью трюков на грани мошенничества (или за гранью, не уверен).

Я просто уже не первый год занимаюсь изучением и дизайном языков программирования.

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

В монаде IO нет ничего особо хакерского. Это просто метод выкинуть из языка лишнее. С помощью этой монады удалось убить сразу двух зайцев:

1)Задать строгий порядок вызова функций.

2)Оставить модель языка простой. Вся высокоуровневая магия работает с чистым языком. Выкидывание RealWorld происходит уже на самых последних этапах.

Это очень грамотное инженерное решение. Проблема в том что куча народа набралась поверхностных знаний и пытается делать на их основе далеко идущие выводы.

Пожалуй я тут закончу. Ибо слушать меня явно не намерены.

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

Судя по тому, что ты называешь мигеля в контексте хацкеля человеком с поверхностными знаниями, все твои занятия «изучением и дизайном ЯП уже не первый год» не стоят вообще ничего.

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

> все твои занятия «изучением и дизайном ЯП уже не первый год» не стоят вообще ничего.

Бугага, ну ты зануда.

Этот чел реально крут и выдает массу ценной и интересной инфы.

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

И чего же ценного он выдает? Фразы в стиле «С помощью этой монады удалось убить сразу двух зайцев: 1)Задать строгий порядок вызова функций. (...)»? Так это наглое вранье же.

sanuda
()

Рефал точно жив, у нас в городе даже пилят компилятор. С тулкитами у него тяжко.

инопланетный синтаксис

Недавно здесь была новость. J, потомок APL.

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

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

Монады в хаскеле понадобились для того что бы зафиксировать порядок вызова функций. Больше они ни для чего не нужны.

это мы-то делаем далеко идущие выводы?

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

> Ну есть же монады и кроме IO, ау!

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

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

> Но все равно операция связывания - единственное, что делает монаду монадой, (...)

Выше же уже говорилось, что на (=<<) свет клином не сошелся, можно заменить join'ом.

может не фиксировать порядок вычислений.

Строго говоря, (=<<) в порядке вычислений роли не играет. В порядке вычислений играет роль композиция таковых, которая в контексте монадических вычислений может быть представлена оператором (<=<).

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

Ну есть же монады и кроме IO, ау!

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

Никак это не называется, всё, что не IO — это обычные чистые значения. То что за экземпляром монады IO лежит особая операционная семантика, никак не меняет того факта, что монадные операции в целом — это обычные функции. Монады не фиксируют порядок вычислений, порядок вычислений можно фиксировать и без монад.

exlevan
()

Куда дели анонимусов? Они бы насоветовали и объяснили, что к чему. Без них лор не тот...

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

>Судя по тому, что ты называешь мигеля ...

Знаешь скока я видел таких «Мигелей» задрочивших святое писание (в данном случае хаскеля) и не видящих за деревьями леса.

И еще больше таких как ты слепо повторяющих за «пророком».

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

>это мы-то делаем далеко идущие выводы?

Разговор шол про монаду IO.

А мне стоило быть более конкретным чтобы не давать тролям повода к словам цепляться.

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

Так уже не раз изложено было. IO — способ описать работу с внешним миром в терминах чистых функций. Чего тут сакрального? Все просто. И не надо придумывать никаких «задать строгий порядок действий», ибо это чушь.

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

> Знаешь скока я видел таких «Мигелей» задрочивших святое писание (в данном случае хаскеля) и не видящих за деревьями леса.

И еще больше таких как ты слепо повторяющих за «пророком».

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

Мигель в данном случае просто прав, а ты нет. И он не пророк, и ты не разоблачитель. Срыва покровов не получилось, старайся упорнее.

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

Ты же за 24 часа до этого сказал «на этом разговор закончу». Девочка передумала? Долго еще попой вертеть тут собираешься?

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

Ну и зачем тогда IO если чистых функций достаточно?

грязная функция в Haskell - это функция с unsafePerformIO

а что внутре у всего остального - какая разница?

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

(a -> IO b) — это и есть чистые функции. Например, не будешь же ты утверждать, что, (a -> State s b) — это функции грязные?

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

Ну так давай говорить предметно, а не скатываться в вслщину.

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

Утверждение номер один: Функциональность ради функциональности добавляют только идиоты.

Чтобы чётко понимать, о чём идёт речь: под словом «функциональность» имеется в виду «функциональное программирование», «набор фич» или что ещё?

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

Речь про http://en.wikipedia.org/wiki/Functional_programming ?

То есть получается, что все, кто jff в свободное время интересуются ФП чисто из-за того, что им нравится чисто сам подход — идиоты? Не соглашусь, ибо это не так.

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

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

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