LINUX.ORG.RU

OCAML vs Haskell


0

1

Давно уже думаю выучить какой-нибудь функциональный язык для быстрой разработки. Остановился на этих двух (Haskell и OCaml) - и всё же сложно выбрать какой-нибудь один, т.к. например OCaml - производительный, имеет кучу библиотек, но кривой (например там and и or - совершенно разные вещи - одна - булева операция а другая - что-то еще), а Haskell - имхо простой и красивый...

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

★★

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

И насколько я помню и and (&&) и or (||) там работают как в Си. Это конечно не совсем хорошо вяжется с идеологией энергичных вычислений, но если теория мешает практике, то в попу такую теорию...

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

> И насколько я помню и and (&&) и or (||) там работают как в Си

Самое удивительное - что это не так - 'or' в ocaml - булева операция, синоним '|' , а 'and' юзается для одновременного объявления - например let nom1=expr1 and nom2=expr2 and nom3=expr3 ...

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

Вроде на семантическом уровне 'and' в биндинге - просто разделитель, а 'and' в выражениях - инфиксная запись функции AND arg1 arg2. Это разруливается на уровне синтаксического разбора и напрягать особо не должно. Просто для себя вместо функции and можно писать &&.

GameMagister
()

Выучи Java.

anonymous
()

где-то год назад был подобный топик.

OCaml --- прекрасный язык, но он не чисто функциональный. на нем можно писать и в императивном стиле.

Haskell же, AFAIK, чисто функциональный, к тому же ленивый (lazy).

если сложно выбрать, то выучи оба. и еще lisp вдобавок.

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

> Кстати как в хаскеле "почувствовать" эту самую lazy ?

поставьте haskell, запустите и откиньтесь на спинку кресла..

// wbr

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

Начни на нем писать, сразу "почувствовуешь". Ну например, как одно из следствий ленивости, бесконечные структуры данных:

numsFrom n = n : numsFrom (n+1)

- бесконечный список целых чисел. А это - бесконечная последовательность чисел Фибоначчи:

fib = 1 : 1 : [ a+b | (a,b) <- zip fib (tail fib) ]

Cantor ★★
()

А что народ думает о Clean, судя по бэнчмаркам, во многих случаях побыстрее OCaml будет. Кто-нибудь работал? И как впечатления?

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

А что думать, он, насколько я знаю, не так уж и давно под Linux появился? На оф. сайте: "The main platforms we support are Windows and Macintosh. "

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

Так ленивый список можно и в ocaml-е и даже в Си сделать (без GC правда могут быть проблемы). В ocaml-е, например, есть потоки, при помощи которых подобные бесконечные последовательности реализуются "на ура".

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

Реально ленивость можно почувствовать только в тех местах где возможно игнорировать потенциальное зацикливание и вычислительноемкую операцию.

anonymous
()

Они всё же существенно разным задачам соответствуют... Так что изучить следует оба, и выбирать в зависимости от потребностей. Так же совершенно необходимо иметь в своём арсенале Лисп.

Только всё равно эти прототипы потом на Java переписывать будешь! :)

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

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

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

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

>Да и вообще ленивые структуры данных - суть простая замена итераторов в императивщине.

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

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

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

Я знаю, что в некоторых энергичных языках конструкторы делают все же ленивыми (оно вообщем то понятно почему), не в курсе как с этим делом в Ocaml-е ?

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

Ага, иперативность OCaml-а не дает на этом уровне использовать ленивые вычисления.

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