LINUX.ORG.RU

Haskell vs Lisp


1

0

Не знаю вообще ни одного функционального языка. С какого легче начать обучение - Haskell или Lisp. И, если Lisp, то какой самый распространенный интерпретатор?

anonymous

Lisp Ъ, а хаскель из Аушвица.

anonymous
()

Не всякий Lisp функционален... lisp-lor-faq для Пушкина сделали? Haskell -- сосет, ибо то что не может приспосабливаться -- сосет и умирает.

anonymous
()

начинай со scheme он более простой

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

> Haskell -- сосет, ибо то что не может приспосабливаться -- сосет и умирает.

С чего многоувожаемый ЛОР аналитик сделал такие далеко идущие выводы? Во первых Haskell куда более точно отражает ФП парадигму, а это дает ему право заставлять приспосабливатся к нему, если на то возникнет надобность, во вторых Haskell все-же куда более удобный, "приспасабливаемый" и обладает куда большими возможностями нежели Scheme. Та-же превосходная система типизации, до которой Scheme и бОльшему числу других языков (в том числе императивных) еще сосать, сосать и сосать.

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

> Гм. Лисп достаточно далёк от функциональных языков.

Есть мнение, что Common Lisp - труЪ функциональный язык (а так же объектно-ориентированный и процедурный).

> Намёк ясен?

Нет. Подробнее, если можно.

tailgunner ★★★★★
()

Если именно учить ФП парадигму - то лучше Haskell - будет сложнее, но мозги вправятся надежнее... Чтобы потом на CL не писать "как на С"... А еще на Haskell'е более явно заметны как плюсы так и минусы ФП, а в лиспе больше заметны плюсы и минусы именно Лиспа, которые не всегда относятся к ФП. Опять же у Haskell community более адекватное, а у Лиспа много пионеров - фанбоев...

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

>> Во первых Haskell куда более точно отражает ФП парадигму

Более точно это как? Типа там нет скобок и все такое?

>> во вторых Haskell все-же куда более удобный, "приспасабливаемый" и обладает куда большими возможностями нежели Scheme

Неее ты гонишь... Это Scheme более удобна и обладает куда большими возможностями чем Haskell

>> Та-же превосходная система типизации, до которой Scheme

А что в ней превосходного?

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

>Более точно это как? Типа там нет скобок и все такое?

Ну например все функции - функции одной переменной. А еще нет сайд-эффектов неконтролируемых - соответственно referential-transparency. Это так для примера.

>Неее ты гонишь... Это Scheme более удобна и обладает куда большими возможностями чем Haskell

И что такого может Scheme чего не может Haskell? На Haskell'е можно писать как на Scheme, но не наоборот... А еще код на Scheme почти всегда получается длиннее, и почти никогда - короче.

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

>> А еще на Haskell'е более явно заметны как плюсы так и минусы ФП, а в лиспе больше заметны плюсы и минусы именно Лиспа

Дык главный минус хаскеля - его функциональная чистота и все ее минусы есть минусы хаскеля by design. А они минусовее минусов лиспа ;))

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

> Есть мнение, что Common Lisp - труЪ функциональный язык

Это мнение неверно.

> Нет. Подробнее, если можно.

Учи Хаскель.

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

>Дык главный минус хаскеля - его функциональная чистота и все ее минусы есть минусы хаскеля by design. А они минусовее минусов лиспа ;))

Это же его главный плюс. А если это для вас больше минус чем плюс - значит у вас императивное мышление.

Из этого как раз следует что для изучения ФП и выбивания императивной заразы он гораздо более подходит. Опять же проблема утекания абстракций в Лиспе более актуальна, чем в Хаскелле

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

>> И что такого может Scheme чего не может Haskell? На Haskell'е можно писать как на Scheme, но не наоборот... А еще код на Scheme почти всегда получается длиннее, и почти никогда - короче.

Мантра: на лиспе вообще и на схеме в частности можно писать как на любом языке. Это в лиспе by design. Насчет длины кода - ну несмотря на то, что на хаскеле код и короче, читать его сложнее.

>> Ну например все функции - функции одной переменной. А еще нет сайд-эффектов неконтролируемых - соответственно referential-transparency. Это так для примера.

Каррированные функции есть и в лиспе. Если в лоб то: (define func (lambda (x) (lambda (y) (lambda(z) ...)) Если не в лоб то на это есть макрос.

Про побочные эффекты - зато когда они нужны в хаскеле (пардон но без них никак) начинается изврат с монадами. Тоже для примера - в Scheme все функции без побочных эффектов, кроме тех, которые явно описаны как с побочными и это лучше чем монады, особенно когда без них код в разы понятнее.

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

>> Дык главный минус хаскеля - его функциональная чистота

> Это свойство ФП, а не хаскеля.

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

cathode
()

Common Lisp не вполне функциональный язык, хотя на нём, особенно с некоторыми компиляторами можно писать в околофункциональном стиле.

Более функциональный вид лиспа - это Scheme.

Но для изучения функциональной парадигмы лучше, конечно, использовать Haskell

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

> Мантра: на лиспе вообще и на схеме в частности можно писать как на любом языке. Это в лиспе by design.

Как насчёт типизации Хиндли-Милнера, лол?

> Каррированные функции есть и в лиспе. Если в лоб то: (define func (lambda (x) (lambda (y) (lambda(z) ...)) Если не в лоб то на это есть макрос.

Такие "карированные" функции и в Си есть, это даже не смешно.

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

>> Это же его главный плюс. А если это для вас больше минус чем плюс - значит у вас императивное мышление.

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

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

>Насчет длины кода - ну несмотря на то, что на хаскеле код и короче, читать его сложнее.

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

>Каррированные функции есть и в лиспе. Если в лоб то: (define func (lambda (x) (lambda (y) (lambda(z) ...)) Если не в лоб то на это есть макрос.

Фуу... у вас еще и чтобы лямбду обьявить слово lambda писать надо... А почему бы карринг не сделать искаропки если он оверхеда не создает... Или у вас чтобы partial application делать нужно тоже извращатся? И какое же это ФП?

>Про побочные эффекты - зато когда они нужны в хаскеле (пардон но без них никак) начинается изврат с монадами.

Если вы думете, что Монады - это только для сайдэффектов, то вы глубоко заблуждаетесь. Это просто другой способ структурирования чистого ФП кода. И некий универсальный интерфейс который можно реализовать и получить много готового и отлаженного кода который будет с ним работать и который уже написан. Поэтому авторы библиотек любят делать свои Монады. Из монад описывающих сайдэффекты главные State и IO - причем без State можно обойтись просто код будет более громоздким и хуже читатся. А у IO как раз главное качество ее однонаправленность - то что под нее можно все поднять, но вынуть уже нельзя, что правильно. Монады это не изврат, а наоборот очень гибкий и полезный инструмент, и то что в Хаскелле есть монады - это его плюс, и минус тем языкам где их нет.

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

> Это же его главный плюс. А если это для вас больше минус чем плюс - значит у вас императивное мышление.

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

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

>> Такие "карированные" функции и в Си есть, это даже не смешно.

Ну так значит не только в одном Хаскеле есть функции одной переменной, так ? :)))

>> Как насчёт типизации Хиндли-Милнера, лол?

Ага, лол. Какое отношение это имеет к "писать программы как на Haskell"?

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

>>> Та-же превосходная система типизации, до которой Scheme

> А что в ней превосходного?

Она таки превосходная :) Только какое отношение это имеет к ФП? :D Другое дело - возможно ли реализовать подобную систему типов не в ФЯ - хз.

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

> Если вы думете, что Монады - это только для сайдэффектов, то вы глубоко заблуждаетесь.

Если ты думаешь, что оператор >>= можно сделать только в Хаскеле, то ты глубого заблуждаешься.

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

>> Фуу... у вас еще и чтобы лямбду обьявить слово lambda писать надо... А почему бы карринг не сделать искаропки если он оверхеда не создает... Или у вас чтобы partial application делать нужно тоже извращатся? И какое же это ФП?

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

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

>> Если ты думаешь, что оператор >>= можно сделать только в Хаскеле, то ты глубого заблуждаешься.

+ 1

Особенно если, учесть что в хаскеле это синтаксический сахар.

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

> Ну так значит не только в одном Хаскеле есть функции одной переменной, так ? :)))

Дитятко, если бы Хаскель Карри был жив, он бы тебя за такие слова собственноручно выпорол, чтобы впредь не болтал чепухи.

> Ага, лол. Какое отношение это имеет к "писать программы как на Haskell"?

Если из Хаскеля убрать карринг и типизацию Хиндли-Милнера, то что вообще останется?

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

>Если ты думаешь, что оператор >>= можно сделать только в Хаскеле, то ты глубого заблуждаешься.

Где я такое говорил?

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

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

Если у вас язык и компилятор голимый то это ваши проблемы...

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

> Другое дело - возможно ли реализовать подобную систему типов не в ФЯ - хз.

А что мешает? Хиндли-Милнер никак не требует чистоты функций. На OCaml, хотя бы, посмотри.

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

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

Согласен - иногда нужно, но императивный код можно и на Хаскелле писать, например in-place quicksort на MArray - но он гораздо длиннее и не всегда лучше.

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

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

Я имел ввиду "искаропки есть", а не "можно сделать"...

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

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

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

А как у вас в Схеме с pattern matching'ом? А в point-free стиле можно писать? А типы свои рекурсивные можно обьявлять? Типы с несколькими параметрами? Бесконечные последовательности?

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

>С удовольствием убил бы тебя.

Начни с себя...

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

> А в point-free стиле можно писать?

Тебе программировать или потрахаться, лол?

Тех, кто всерьёз пишет в point-free стиле, я собственноручно отыскиваю и отрезаю им яйца тупыми канцелярскими ножницами, чтоб не плодились.

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

>> Если у вас язык и компилятор голимый то это ваши проблемы...

А что в хаскеле кложуры и карринг как то по другому реализованы? Лол.

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

>А что в хаскеле кложуры и карринг как то по другому реализованы? Лол.

А твой моск не допускает такой мысли? Что (f a b) и ((f a) b) дают в результате тот же код? Ну вам с вашим кривым самодельным каррингом этого не дано...

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

>> А как у вас в Схеме с pattern matching'ом? А в point-free стиле можно писать? А типы свои рекурсивные можно обьявлять? Типы с несколькими параметрами? Бесконечные последовательности?

http://okmij.org/ftp/Scheme/monad-in-Scheme.html

http://download.plt-scheme.org/doc/103p1/pdf/match.pdf

Остальное ты найдешь в wizard book

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

> кложуры

Псевдоэлитарное быдло детектед.

Читай по губам: З-А-М-Ы-К-А-Н-И-Я.

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

> Остальное ты найдешь в wizard book

Фу как некрасиво - еще небось и оверхед создает. А можешь lazy pattern matching таким способом сделать? Вобщем создалось у меня впечатление что в Схеме искаропки ничего нет и все костыли городят... Ты кстати не на все мои вопросы ответил...

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

>> А твой моск не допускает такой мысли? Что (f a b) и ((f a) b) дают в результате тот же код? Ну вам с вашим кривым самодельным каррингом этого не дано...

Твое поколение хаскеллистов вымрет от сахарного диабета - ешьте много синтаксического сахара :)))

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

> А как у вас в Схеме с pattern matching'ом?

Через библиотеку

> А в point-free стиле можно писать?

ХЗ

> А типы свои рекурсивные можно обьявлять?

Это как? И для чего?

> Типы с несколькими параметрами?

Конечно. И даже композитные типы можно. Например, "целое число от 3 до 7 или булевское число, но не 6"

> Бесконечные последовательности?

Лисп - это пластелин. Даже если чего-то нет, то реализуется через библиотеку, расширяющую язык.

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

>Тех, кто всерьёз пишет в point-free стиле, я собственноручно отыскиваю и отрезаю им яйца тупыми канцелярскими ножницами, чтоб не плодились.

Пайпами в шелле принципиально не пользуешься? Я и говорю императивное мышление...

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

>> Фу как некрасиво - еще небось и оверхед создает. А можешь lazy pattern matching таким способом сделать? Вобщем создалось у меня впечатление что в Схеме искаропки ничего нет и все костыли городят... Ты кстати не на все мои вопросы ответил...

Ъ по ссылкам не ходят да?

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

>> А в point-free стиле можно писать?

> ХЗ

Почитал про point-free, ну это же совсем элементарно делается!

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

>> Фу как некрасиво - еще небось и оверхед создает

Если это про pattern matching, то если ты не заметил лисповый вариант куда мощьнее хаскелльного. Например ты можешь в хаскелле сматчить s-expression?

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

>Это как? И для чего?

Trees. A tree is an example of a recursive datatype. Typically, its definition will look like this:

data Tree a = Leaf a | Branch (Tree a) (Tree a)

>Лисп - это пластелин. Даже если чего-то нет, то реализуется через библиотеку, расширяющую язык.

По мне так это велосипедизм, вместо одной стандартной реализации - зоопарк костылей... А библиотек можно и в Haskell'е наплодить...

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