LINUX.ORG.RU

Lisp и Haskell


0

1

Знаю lisp(CL) и в принципе он меня всем устраивает, но недавно попробывал выучить Haskell и понял что в нем есть некоторые фичи которых мне не хватает в лиспе. Отсюда вопрос: нет ли такого языка который бы сочитал черты хаскела и ласпа? Конкретно хотелось бы: простой синтаксис как у лиспа, возможность легко изменять язык (что то типа макросов лиспа), ленивость, сопоставление с образцом, списки как в лиспе(переменные разных Заранее благодарен.

anonymous

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

>> А че на лиспе написали? На Хаскелле хотя бы Рugs и xmonad - это навскидку...

Блин, ты с луны что-ли упал? Emacs хотя бы возьми. А вообще вот: http://www.lisp.org/table/tools.htm

>> http://www.haskell.org/haskellwiki/Haskell_in_industry

Бугага! Это все? Получи фашист гранату: http://www.lisp.org/table/commercial-use.htm

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

>Ну и в схеме такие функции имеют специальное обозначение - set!, set-car! и т.д. у всех "!". Теперь схема такая же безопасная как хаскель?

Нет, потому что в том же примере с массивами все эти unsafe закрываются под монаду и локализуются. Если например есть функция которая принимает аргументом чистую функцию, то функцию с такими сайдэффектами туда уже не засунешь, соответственно и результат этой функции тоже будет свободен от сайдэффектов, на это можно будет опиратся и абстракции не будут течь. А если ты в какой нибудь mapcar (который не mapcar!) скормишь лямбду внутри которой используешь какой нибудь set-car! то результат этого mapcar может иметь сайдэффект хотя функция то без ! - это утрированный пример конечно. (тут можно проконтролить, но когда функция с сайдэффектом используется чтобы сделать другую функцию, которая затем куда то передается, то сайдэффект может глубоко уйти и вылезти в непредсказуемом месте)

>Я одного не пойму: почему для хаскеля unsafe - это ничего страшного, только нужно "очень хорошо проверять код", а для всех остальных уголовная статья.

Потому как страшен не сайдэффект, а его неконтролируемое распространение которое рушит referential transparency и создает утечки абстракций. То есть например State локализованный в соответствующей монаде вполне себе кошерен и безопасен.

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

>Блин, ты с луны что-ли упал?

Это шутка была с закосом под троллинг. Не напрягайся... :)

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

>Чеж хаскель ваш который такой офигенный до сих пор в жопе болтается и никак не дорастет хотябы до уровня лиспа по используемости?

ты бы ещё с FORTRAN'ом сравнил. возраст немножко разный, не находишь ?

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

>Я одного не пойму: почему для хаскеля unsafe - это ничего страшного, только нужно "очень хорошо проверять код", а для всех остальных уголовная статья

вопрос стиля. haskell очень жёсткий язык, любые отклонения от чистого ФП-подхода в нём нетривиальны - при всём желании выстрелить себе в ногу с его использованием весьма непросто. хотя, как тут уже обсуждалось, do-нотация несколько эту картину портит

а и что значит - статья ? отсутствие чего-либо - не плюс языка, а его особенность, специфика. покажешь книгу по haskell где было бы написано что сайд-эффекты/unsafe операции не нужны ?

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

>> Потому как страшен не сайдэффект, а его неконтролируемое распространение
>> Нет, потому что в том же примере с массивами все эти unsafe закрываются под монаду

Кхм... Я бы сказал не локализуются и накрываются волосатой монадой:

test :: IORef [a]
test = unsafePerformIO $ newIORef []
  
main = do
         writeIORef test [42]
         bang <- readIORef test
         print (bang :: [Char])

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

>> вопрос стиля. haskell очень жёсткий язык, любые отклонения от чистого ФП-подхода в нём нетривиальны

Садомазоязычок жесткого функционального программирования. Короче язык для умственных извращенцев?

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

Ага, обязательно попадешь себе по яйцам или в затылок.

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

>Садомазоязычок жесткого функционального программирования

скажи честно, тебе в детстве монография по лямбда-исчислению на голову не падала ?

>Короче язык для умственных извращенцев?

ты знал !

>Ага, обязательно попадешь себе по яйцам или в затылок.

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

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

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

контролируемого, безопасного, но совсем не очевидного. к тому же ну показал ты что программу на haskell можну завалить в кору - дык ведь с этим вроде никто и не спорит. а вообще для низкоуровневого программирования на haskell пи-логику придумали, которая позволяет подобные конструкции верифицировать в статике. погугли hOs, house, H monad

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

>Пример контролируемого и безопасного падения в корку.

А тебя не смущало почему unsafePerformIO в отдельном модуле определено и там еще написано So be careful! ?

Сам то ты проверял это или тупо скопипастил? У меня оно "*" выводит, что есть (char)42 и в корку не падает... Конечно никакой язык не запретит тебе самому себе засады расставлять, но Хаскелл сильно снижает вероятность возникновения всяких сложнонаходимых багов по ошибке.

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

>> скажи честно, тебе в детстве монография по лямбда-исчислению на голову не падала ?

Нет.

>> что ты, что ты. такую гибкость только LISP и способен предоставить

Нет, это только хескелисты очень хотят выстрелить себе в ногу и у них это не получается - не попадут никак. Imp - это уже несколько раз подтвердил. В лиспе все проще: нужно выстрелить в ногу хаскеля берешь и стреляешь. Хотя лучше стрелять по монадам - тогда хаскель тереят способность к распространению и эфектам на стороне :))

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

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

на протяжении всего этого треда ты именно в этом всех пытаешься убедить. я думаю корректней было бы сказать - лисперы, пытаясь писать на haskell, прежде всего возмущаются тем, как сложно попасть в ногу. или по затылку. или...ну я думаю ты понял, да ?

>нужно выстрелить в ногу хаскеля берешь и стреляешь

во-во, я о том же

>Хотя лучше стрелять по монадам - тогда хаскель тереят способность к распространению и эфектам на стороне :))

интересно, а с Clean ты что делать будешь ? по чём стрелять ? :)

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

> Пример контролируемого и безопасного падения в корку.

Интересно, что за компилятор? у меня на ghc 6.8.2 ничего не падает

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

>> А тебя не смущало почему unsafePerformIO в отдельном модуле определено и там еще написано So be careful! ?

А там не написано, что за использование - пожизненный эцих с гвоздями? Нет? А зря.

Нет ну честно, объясни зачем в чистом функциональном языке unsafePerformIO? Правильно говорят, что чистый язык - бедный язык.

>> Сам то ты проверял это или тупо скопипастил?

Угу. И скопипастил и проверил и упало.

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

Потому, что про unsafePerformIO не рассказано ни в одном туториале. Конечно, зачем портить имидж _чистого_ языка всякими бяками.

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

>> интересно, а с Clean ты что делать будешь ? по чём стрелять ? :)

По монадам конечно. В хаскель только по монадам.

>> я думаю корректней было бы сказать - лисперы, пытаясь писать на haskell, прежде всего возмущаются тем, как сложно попасть в ногу. или по затылку. или...ну я думаю ты понял, да ?

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

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

>Интересно, что за компилятор? у меня на ghc 6.8.2 ничего не падает

аналогично

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

>Интересно, что за компилятор? у меня на ghc 6.8.2 ничего не падает

Hugs 98
Version: Sep 2006

MyUnsafe> main
"\
Program error: Prelude.!!: negative index

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

>По монадам конечно. В хаскель только по монадам

ты, сдаётся мне, не понял вопроса

>Подитожу: все, что противоестественно всегда очень сложно: спать на потолке, срать в почтовый ящик, писать на хаскеле

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

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

Между прочим, для тех кому очень не нравятся чистота, монады, и монадные трансформеры теперь есть диалект хаскеля disciple, где все императивные ужасы умудряются типизировать. (http://haskell.org/haskellwiki/DDC). Иногда мне самому кажется, что за этим будущее :-)

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

>Между прочим, для тех кому очень не нравятся чистота, монады, и монадные трансформеры теперь есть диалект хаскеля disciple, где все императивные ужасы умудряются типизировать

"...fortunately not all is lost. Mathematicians got to work and developed a number of tricks to ensure code gets executed in particular order in a functional setting. We get the best of both worlds ! These techniques include continuations, monads, and uniqueness typing..."

это я к тому, что есть clean, в котором вместо монад это самое uniqueness typing. впрочем, сам я с clean не работал

jtootf ★★★★★
()

плюньте на все и учите J (jsoftware.com) ! тут вам и высочайшая скорость исполнения, и выразительность, и гимнастика для ума..

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

>плюньте на все и учите J (jsoftware.com) ! тут вам и высочайшая скорость исполнения, и выразительность, и гимнастика для ума..

при всём моём уважении к потомкам APL это write-only языки. поиграться с ними - да, писать что-то серьёзное - только если это крайне необходимо и всячески обосновано. да и то сказать, спектр их применения не так уж и широк - FRP, например, на них не особо попишешь

кстати если уж речь зашла о скорости выполнения, то K быстрее чем J

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

>> ты, сдаётся мне, не понял вопроса

Ну как ты его задал, так я и ответил.

>> идиот. притивоестественна цель, которую ты ставишь. из того что ты способен засунуть лампочку в рот (предварительно повозмущавшись тем как сложно это сделать) не следует что от лампочек следует отказаться в угоду керосинкам. подумай об этом на досуге

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

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

> кстати если уж речь зашла о скорости выполнения, то K быстрее чем J
по моим тестам - все как раз наоборот.

Насчет write-only - тоже неправда. Сколько времени вы потратили на изучение J? А на хаскель? После сопоставимого по времени тренинга код на J читатется не многим хуже, чем на хаскеле. А здесь надо учесть, что читать на J придется на порядки меньше.

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

>> для тех кому очень не нравятся чистота, монады, и монадные трансформеры теперь есть диалект хаскеля disciple

Монады - это програмистский трюк, не более того. Иногда полезны, иногда нет. Реализуются в любом языке. Не нравится их повсеместное насаждение в хаскеле.

Монадные трансформеры - когда не используются монады - не нужны. Опять же програмистский трюк и в хаскеле можно свободно программить без них и без монад (кроме наверное IO).

Чистота - залог здоровья :)

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

>...и в хаскеле можно свободно программить без них и без монад

так а в чём претензия ?

вон на CL программировать без CLOS можно, и без Conditions. и без макров тоже. и что с того ?

логика просто потрясает

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

>> плюньте на все и учите J

require 'viewmat'
hp=: 3 : '(|.,]) 1 (0 _2 _2 ,&.> _2 _1 0 + #y) } (,.|:) y'
MG=: 256 #. 128 0 128,:0 192 0
viewrgb 2 ([ # #"1) MG {~ hp ^:6 [ 0, 0 1 0 ,: 0

Жесть! Ты языки отбираешь по принципу "чем чуднее тем моднее"?

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

>> так а в чём претензия ?

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

>> логика просто потрясает

У тебя лампоска изо рта выпала, вставь назад.

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

Я не спорю что трюк, дело в том что disciple заменяет эти трюки на расширения системы типов -- это упрощает ситуацию. А трюки эти в 90% real-world хаскеля используются

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

При чем здесь мода? Это сугубо практичный язык. Посмотрите из книги "J for C programmers", например).
Я использую J по той причине, что полноценная программа у меня занимает 1 страницу кода, влёт читается, и исполняется быстрей аналогичной, написанной на Си

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

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

Бредище какое. А кто более чистый и функциональный? Кстати, о каком хаскеле идет речь -- неужели о haskell 98? :-)

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

> Чистота - залог здоровья :)

Бред совковый.

Взрощенные в стерильных условиях подыхают от первого же словленного гриппа. Грязь - залог хорошего иммунитета. Ребёнок, которому не дают тянуть в рот всё, что найдёт, имеет шансы помереть от ОРЗ в 20 лет.

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

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

ну вот ты подбираешься к истине. ещё немного и поймёшь, что всю эту шлаету туда добавили не затем, чтобы усложнить жизнь программистам, а как раз наоборот. и пишут, и радуются. Parsec вон написали, AFRP (Yampa) написали, на Yampa даже 3D-шутер от радости написали. уложившись в ~200Kb исходников

>Претензия в том (и я уже не раз об этом здесь напсиал), что...

это не претензия. претензия звучит так : вот это и это - плохо. что именно в языке плохо ? то, что он не чистый и не функциональный ? ну тогда LISP это вообще редкостное гуано, nes ce pas ?

>хаскель нифига не чистый и ни разу не функциональный

это не я придумал, это как бы согласно формальному определению чистоты и ФП. кстати вот насчёт чистоты претензии понятны, а с функциональностью-то что не так ?

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

>> Я использую J по той причине, что полноценная программа у меня занимает 1 страницу кода

Полноценная программа на дельфи делается за 3-5 кликов мышкой. В код можно даже не смотреть :)

>> Это сугубо практичный язык.

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

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

>> Бредище какое.

Докажи обратное, если сможешь. Речь идет о хаскель + расширениях.

Императивщина в нем есть? Есть. do-нотация, unsafePerformIO например.

>> А кто более чистый и функциональный?

Чистый и функциональный язык бесполезен.

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

>> Взрощенные в стерильных условиях подыхают от первого же словленного гриппа. Грязь - залог хорошего иммунитета. Ребёнок, которому не дают тянуть в рот всё, что найдёт, имеет шансы помереть от ОРЗ в 20 лет.

Шансы помереть от ОРЗ есть у всех. Ребенок живущий в грязи и антисанитраии имеет шанс умереть от гепатита в первый год жизни.

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

> Речь идет о хаскель + расширениях.

А, так речь идет о расширениях, добавляющих в хаскель не-чистоты? Ну и что за вопросы тогда?

> Чистый и функциональный язык бесполезен.

На haskell98 таки что-то написано :-)

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

>> это не претензия. претензия звучит так : вот это и это - плохо.

Хаскель и его фанаты - это плохо. Претензия принята?

>> что именно в языке плохо ?

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

>> а с функциональностью-то что не так ?

Ну открой исходники xmonad например и увидишь что процентов 50 кода написано в императивном стиле (do-нотация)

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

>> А, так речь идет о расширениях, добавляющих в хаскель не-чистоты? Ну и что за вопросы тогда?

Т.е. факт того, что хаскель не чистый и не функциональный признаем?

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

>Монады - это програмистский трюк, не более того. Иногда полезны, иногда нет. Реализуются в любом языке. Не нравится их повсеместное насаждение в хаскеле.

Вы неумеете их готовить... Вот например у меня есть задача, функция которая должна составить список, причем нужно сначала сделать предположение и попытаться составить список, на определенном шаге мы можем столкнутся с противоречием и тогда мы должны вернутся в верхний уровень и пойти другим путем считая что наше предположение неверно. Делается очень просто - поднимаем функцию в монаду Maybe, наверху делаем head . catMaybes - элегантно читабельно и безопасно. Или список всех пар чисел от [1..n] pairs n = liftM2 (,) x x where x=[1..n]

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

> Т.е. факт того, что хаскель не чистый и не функциональный признаем?

Факт существования расширений, не входящих в стандарт -- признаем. Про хаскель тут кажется ничего не говрилось :-)

Если бы в haskell98 были бы existentials, мой текущий проект был бы написан на нем. Ну и причем тут "не чистый и не функциональный язык хаскель"?

pierre
()

Да не кормите вы трольчонка. Хаскель — своего рода первый блин, не надо от него слишком многого ждать. Сложен, непонятен, компиляторов нормальных нету... и то много где используется с пользой, а значит, имеет право на существование. Со временем это всё выльется, думаю, в нормальный полноценный мэйнстримный язык, не хуже того же Питона. Disciple — верный шаг в этом направлении. Правда, у меня на AMD64 оно ни разу не собирается пока, лол, но поглядим, что дальше будет.

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

Естественный отбор. Помереть в 1 год не так обидно, как в 20.

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

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

Не зря же Simon Peyton Jones в MS работает, счас обкатают фичи на Хаскелле, а потом в F# заинтегрируют.

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

>Хаскель и его фанаты - это плохо. Претензия принята?

то, что фанаты плохо - верно, тому ты живое подтверждение. всё остальное - несостоятельно

>Ну открой исходники xmonad например и увидишь что процентов 50 кода написано в императивном стиле (do-нотация)

перепиши xmonad на любом языке по своему усмотрению так, чтобы было лучше. сможешь ?

кстати тот факт, что do-нотация ~ императивный стиль в общем-то миф. взгляни ещё раз на xmonad и убедись, что do-нотация там практически всегда идёт в связке с замыканиями и сравнением по образцу; процентов 80 от этого самого "императивного" кода (того, что вложено в do-блоки) на самом деле оказывается сугубо функциональным. собственно описание последовательности, связка операций - небольшая и несущественная часть кода

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

> Правда, у меня на AMD64 оно ни разу не собирается пока

У меня тоже. Там видать что-то радикальное надо делать

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