LINUX.ORG.RU

[монады] абстракция или костыль?


0

0

Здравствуйте.

У меня возник вопрос относительно темы топика. Есть ли смысл применения монад в языках, поддерживающих фп, и в чём тут выгода? И соответственно, в чём тогда заключается практический смысл их законов и преобразований, или же это только вписывание состояния с типом и аппликативного порядка вычислений в один язык для красивого соответствия теории?

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

>Ты то конечно, его очень знаешь, умник. Кто же еще может такой бред как «Абсолютно ленивый язык программирования» написать, кроме как «знающий хаскель».

Я слов «абсолютно ленивый язык» не писал. Ты так и не понял того, что я про сайд эффекты в хаскеле писал.

Т.е. на хаскеле кода не пишут? А если и пишут, то левым пальцем правой ноги, и объяснить чего написали, и что оно делает, не могут? :)

Может ты больше не будешь так уныло троллить?

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

с тезисом вида «макросы фича языконезависимая, но сильно зависит от языка»?

Ну, во-первых, я написал «более-менее» независимая. И это более-менее относится только к полноте реализации фичи. И препроцессор Си, и MetaOCaml, и TH это тоже макросы, хотя и убогие.

константность даёт ещё больше гарантий

void Method() const
{
        *((size_t*)this)=0xDEADBEEF;
}

впрочем, если ты считаешь это syntactic ocbstacles, то говорить с тобой о статически типизированном языке любого вида - бесполезно

Почему? У статики есть неоспоримые преимущества - программы на статических языках написанные работают часто быстрее, и с application deployment, в современных системах, проблем меньше.

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

В брейнфаке тоже много чего реализуется - говорят, все что угодно. А еще можно взять lex/yacc, ага.

использовнаие монад - подход к инкапсуляции, абстракция данных (как в случае Reader, Writer, State) и вычислительного процесса (как в случае List или Omega).

Т.е. все-таки можно считать, что это специфическая для хаскеля фича, с помощью которой в нем просто-напросто реализуеться то, что в других языках реализуется тоже, но не через такую жэ; т.е. костыль?

если ты считаешь, что у процедур есть достоинства, а у монад - нет, то ты противоречишь сам себе

Каким образом? Точно так же я мог написать «у процедур есть неоспоримые преимущества, а вот какие преимущества у замыканий?».

Love5an
()
Ответ на: комментарий от Love5an
void Method() const 
{ 
        *((size_t*)this)=0xDEADBEEF; 
} 

и что ты хотел этим сказать? что в C++ нет константности? и какое отношение это имеет к теме разговора?

все-таки можно считать, что это специфическая для хаскеля фича

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

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

а макры - это такая фича в лиспе, с помощью которой просто-напрсто реализуется то, что в других языках реализуется тоже, но не через такую жэ? например, с помощью макр в лисп можно добавить статическую типизацию, но получится такое говно, что им никто не станет пользоваться :( иными словами, CL - это такой один большой костыль, в котором нет ничего, но всё кое-как можно сделать с помощью универсального костыля

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

Точно так же я мог написать «у процедур есть неоспоримые преимущества, а вот какие преимущества у замыканий?»

у тебя с логикой проблемы? или с чтением?

читай по буквам: монада - это класс типов, описывающий специфический паттерн, связывающий две операции над одним типом данных; реализация этого класса типов может инкапсулировать как поток вычислений, так и данные для них. преимущества использования монад над безмонадическим ФП - повышение уровня абстракции, уменьшение связи между слоями системы. в ОО-языках для тех же целей используются классы; существенная разница заключается в том, что монада - не единственный возможный подобный механизм в Haskell, реализуемый посредством классов типов. более того, один и тот же модуль может иметь различные интерфейсы для работы с ним (так, и Parsec и Phooey имеют как монадический, так и аппликативный интерфейс)

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

Ну вот, а я-то надеялся, что все оценят иронию

у меня от подобных тредов глаз дёргаться начинает

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

>Т.е. на хаскеле кода не пишут?

При чём тут хаскель? Разговор был об субъектисности суждений об «практической неприменимости» абстракций. Из того, что ты не видишь монады «везде», следует вывод не об их непрактичности но об «ограниченности» твоих знаний|умений|интересов|etc.

DonkeyHot ★★★★★
()

Вот, накатал в продолжение темы здесь на ЛОРе. В одном месте вижу повторение. Вкралось когда дополнял. Но в целом вроде бы ничего. Отражает мои мысли. Знакомьтесь:

http://dsorokin.blogspot.com/2009/12/blog-post.html

Отрывок из начала:

«Недавно открыл для себя мир функциональных языков. Увлечен. Особенно потряс Хаскель. Последний довольно необычен и не похож на другие языки. Решил для себя привести свои мысли о нем в порядок и записать в виде небольшого изложения. У меня получается, что Хаскель – очень продуманный язык, где разные концепции взаимосвязаны и следуют друг от друга. Отправной точкой служит чистота языка.

Другим мотивом послужило повышение внимания к теме Хаскеля со стороны многих программистов [тут ссылка на лиспотроллей]. Есть ряд заблуждений и мифов относительно языка. Поэтому хотелось бы некоторые вещи прояснить. ...»

Добрые пожелания приветствуются.

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

> Под наукой я тут имею ввиду фундаментальную науку.

Agreed.

_что_ с ними потом делать(т.е. «_КАК_»)

Один я вижу противоречие в этой фразе? Не говоря уже о том, что она не имеет никакого отношения к делу.

Именно в фундаментальной науке никого не е^Hволнует, ЧТО такое электрон, например. Единственный интересный вопрос - КАК этот электрон себя ведёт; ещё точнее - КАК он себя проявляет.

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

> впрочем, если ты считаешь это syntactic ocbstacles, то говорить с тобой о статически типизированном языке любого вида - бесполезно

Справедливости ради - в плюсах это действительно syntactic obstacles, ибо есть вещи типа const_cast. Ну дык плюсы - язык со слабой типизацией, им таки можно.

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

Рановато кнопку нажал.

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

Вообще-то ещё Луговский, помнится, говорил, что частичное применение эквивалентно макросам...

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

> Ты то конечно, его очень знаешь, умник.

Ну, я знаю. Можешь глянуть на http://migmit.vox.com , если не веришь. И таки да, неленивые конструкции в Хаскеле - вопрос оптимизации.

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

> программы на статических языках написанные работают часто быстрее

Это - меньшее из преимуществ статической типизации.

В Лиспе тоже много чего реализуется - говорят, все что угодно.

fixed

Т.е. все-таки можно считать, что это специфическая для хаскеля фича

Нет, специфической для хаскеля фичей являются классы типов.

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

Ну, в Схеме такие же примерно вещи делаются через continuations. Вот это, по-моему, задница полная.

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

>Вообще-то ещё Луговский, помнится, говорил, что частичное применение эквивалентно макросам...

Вроде как говорил и вроде как даже еще где-то вспоминалось. А вот ссылочкой на примеры не поделится никто? Про поинтфри читал, но что-то ИМХО это не совсем то.

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

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

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

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

В С++ все можно и без классов сделать, списки например, на структурах. А в хаскеле? Последовательные вычисления без монады IO?

Love5an
()
Ответ на: комментарий от Love5an
case f x of
  ... -> g y

Сколько раз говорить: порядок вычислений не в IO сосредоточен.

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

> В С++ все можно и без классов сделать, списки например, на структурах. А в хаскеле? Последовательные вычисления без монады IO?

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

И при чём здесь вообще Хаскель? Вопрос в топике был про монады, а монады используются далеко не только в Хаскеле.

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