Re[22]: Is C# becoming a functional language?
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.02.07 19:06
Оценка:
Здравствуйте, EvilChild, Вы писали:

VD>>C# не является линивым, и является императивным. В нем вычисления и так импереативныи и последоательны. Монады ему ныжны как рыбе зонтик.


EC>

EC>Language Integrated Query (LINQ) is a framework that is rooted
EC>in the theoretical ideas of monads and monad comprehensions to
EC>allow seamless querying over objects, XML, and relational data.


EC>Отсюда.


Ты любой рекламный булшит читашь? Тогда знай, что в документации по W2003 сказано, что дотнет это средство организации веб-сервисов.

Насколько я помню идея "query comprehensions" была реализована на Лиспе еще до того как авторы Хаскеля придумали Хаскель.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[23]: Is C# becoming a functional language?
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.02.07 19:06
Оценка:
Здравствуйте, BulatZiganshin, Вы писали:

BZ>т.е. как видите монада используется сначала для перебора значений в некотором источнике, а затем для отсеивания тех, которые нас не устраивают, при этом описание перебираемого набора и условий отбора коструируется последовательно, предложение за предложением. в linq, как я понимаю, используется что-то похожее, и его операции — это statement'ы монады, перебирающие источник данных или отсекающие ненужные значения. не знаю, правда, как group by в это вписан


Замечательно. Но причем тут монады? Это проблемы реализации императивных алгоритмов на Хаскеле. Таких проблем ни в одном ООЯ нет в помине, так как в них есть объекты с изменяемым состаянием.

Теперь перечитай еще раз бредовый лозунг EvilChild-а:
LINQ это монады для мейнстрима.
Автор: EvilChild
Дата: 06.02.07

За одно стоит поглядеть в каком контексе он его ляпнул.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[22]: Is C# becoming a functional language?
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.02.07 19:06
Оценка:
Здравствуйте, lomeo, Вы писали:

L>Нет. Это всего лишь одна из областей их применения.

L>В LINQ используется не она.

Нет это их смысл. А вот области применения определяются этим смыслом.

В общем, приведи плиз пример где в ООЯ были бы нужны монады.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[24]: Is C# becoming a functional language?
От: EvilChild Ниоткуда  
Дата: 07.02.07 19:23
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Замечательно. Но причем тут монады? Это проблемы реализации императивных алгоритмов на Хаскеле. Таких проблем ни в одном ООЯ нет в помине, так как в них есть объекты с изменяемым состаянием.


VD>Теперь перечитай еще раз бредовый лозунг EvilChild-а:

VD>LINQ это монады для мейнстрима.
Автор: EvilChild
Дата: 06.02.07

VD>За одно стоит поглядеть в каком контексе он его ляпнул.

Те, кто хотел понять поняли, но тебя больше буквоедство увлекает — вопрос исчерпан.
now playing: Boards of Canada — Open The Light
Re[27]: Is C# becoming a functional language?
От: EvilChild Ниоткуда  
Дата: 07.02.07 19:23
Оценка:
Здравствуйте, VladD2, Вы писали:

EC>>В буквальном смысле (если брать за определение реализацию в Haskell) конечно нет, но идея оттуда.

EC>>Я не ожидал, что будут читать буквально.
EC>>Исходный смысл моего поста в том, что монады штука не безполезная и LINQ тому подтверждение.

VD>Монад нет в C#, так как они на фиг не упали в ООЯ. Эта сущьность нужна только чтобы убрать идеологические проблемы ленивого, "чистого" ФЯ.


Т.е., по твоему, не в чистом ФЯ от них толку нет?
now playing: Boards of Canada — Open The Light
Re[24]: Is C# becoming a functional language?
От: EvilChild Ниоткуда  
Дата: 07.02.07 19:53
Оценка: -1
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, BulatZiganshin, Вы писали:


BZ>>т.е. как видите монада используется сначала для перебора значений в некотором источнике, а затем для отсеивания тех, которые нас не устраивают, при этом описание перебираемого набора и условий отбора коструируется последовательно, предложение за предложением. в linq, как я понимаю, используется что-то похожее, и его операции — это statement'ы монады, перебирающие источник данных или отсекающие ненужные значения. не знаю, правда, как group by в это вписан


VD>Замечательно. Но причем тут монады? Это проблемы реализации императивных алгоритмов на Хаскеле. Таких проблем ни в одном ООЯ нет в помине, так как в них есть объекты с изменяемым состаянием.


Сокращённая цитата из книги Р. В. Душкин "Функциональное программирование на языке Haskell"
Автор(ы): Р. В. Душкин
Издательство: ДМК пресс
Цена: 314р.

Данная книга является первым в России изданием, рассматривающим функциональное программирование в полном объеме, достаточном для понимания новичку и для использования книги в качестве справочного пособия теми, кто уже использует парадигму
:

Монада — это контейнерный тип данных, который представляет собой экземпляр класса Monad,
так же это экземпляр класса Functor, который декларирует наличие одной функции высшего порядка, преобразующей значения в контейнере в соответствии с некоторой функцией.

Как видишь довольно общая идея, применение которой можно найти не только в Haskell.
Механизмы LINQ (трансформация одной последовательности в другую) ложаться в её рамки,
а то, о чём ты говоришь не более чем частные случаи.
now playing: Boards of Canada — Open The Light
Re[25]: Is C# becoming a functional language?
От: palm mute  
Дата: 07.02.07 20:00
Оценка: +3
Здравствуйте, EvilChild, Вы писали:


EC>Как видишь довольно общая идея, применение которой можно найти не только в Haskell.

EC>Механизмы LINQ (трансформация одной последовательности в другую) ложаться в её рамки,
EC>а то, о чём ты говоришь не более чем частные случаи.
Народ, не тратьте силы понапрасну.
Re[28]: Is C# becoming a functional language?
От: Quintanar Россия  
Дата: 07.02.07 20:04
Оценка:
Здравствуйте, EvilChild, Вы писали:

EC>Т.е., по твоему, не в чистом ФЯ от них толку нет?


Тольку мало. Они вносят оверхед, трудны для понимания и грязны с теоретической точки зрения (должны выполняться законы, которые не проверить автоматически). Из-за возможности создать неправильную монадуу компилятор не может провести оптимизацию, исходя из общих монадических законов.
Re[29]: Is C# becoming a functional language?
От: BulatZiganshin  
Дата: 07.02.07 20:21
Оценка: :)
EC>>Т.е., по твоему, не в чистом ФЯ от них толку нет?

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


в хаскеле они тожде не являются частью языка, и для них нет автооптимизаций, связанных с выполнением этих законов. какой удар!
Люди, я люблю вас! Будьте бдительны!!!
Re[29]: Is C# becoming a functional language?
От: EvilChild Ниоткуда  
Дата: 07.02.07 20:31
Оценка:
Здравствуйте, Quintanar, Вы писали:

EC>>Т.е., по твоему, не в чистом ФЯ от них толку нет?


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


А какие им есть альтернативы в случае чистого ФЯ? Кроме Uniqueness Typing из Clean?
now playing: Boards of Canada — Roygbiv
Re[30]: Is C# becoming a functional language?
От: Quintanar Россия  
Дата: 07.02.07 20:54
Оценка:
Здравствуйте, BulatZiganshin, Вы писали:

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


1) В Хаскеле есть типы классов. Без них монады практически бесполезны.
2) Специальная поддержка в GHC есть.
3) Монады все равно даже в GHC вносят тормоза. Бесплатно ничего не бывает.
Re[31]: Is C# becoming a functional language?
От: EvilChild Ниоткуда  
Дата: 07.02.07 21:01
Оценка:
Здравствуйте, Quintanar, Вы писали:

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


Q>1) В Хаскеле есть типы классов. Без них монады практически бесполезны.

Q>2) Специальная поддержка в GHC есть.
Речь о do нотации?
Q>3) Монады все равно даже в GHC вносят тормоза. Бесплатно ничего не бывает.
Можно подробнее?
now playing: Boards of Canada — Olson
Re[31]: Is C# becoming a functional language?
От: Quintanar Россия  
Дата: 07.02.07 21:01
Оценка:
Еще забыл добавить — монады антифункциональны. Меня крайне раздражала эта их черта в Хаскеле — как будто не на красивом ФЯ пишешь, а на кривой императивной приблуде. Кстати, ленивые вычисления и монадно-императивный подход не очень-то совместимы.
Re[32]: Is C# becoming a functional language?
От: Quintanar Россия  
Дата: 07.02.07 21:09
Оценка:
Здравствуйте, EvilChild, Вы писали:

Q>>2) Специальная поддержка в GHC есть.

EC>Речь о do нотации?

Да.

Q>>3) Монады все равно даже в GHC вносят тормоза. Бесплатно ничего не бывает.

EC>Можно подробнее?

Скажем, монада, которая имитирует исключения с помощью Nothing/Just. Понятно, что руками писать все эти проверки не надо, но на деле они все равно есть. Исключения, очевидно, работали бы в разы эффективнее и в GHC их таки добавили.
Ну и в целом. Каждая монадная операция — это вызов bind. По коду с виду может быть все красиво, а bind в это время будет отжирать ресурсы — в parsec, вроде, такая проблема.

Самый главный аргумент против — это то, что при интенсивном применении монад код становится императивным и по сути и по виду. Это не может не бесить.
Re[33]: Is C# becoming a functional language?
От: EvilChild Ниоткуда  
Дата: 07.02.07 21:26
Оценка:
Здравствуйте, Quintanar, Вы писали:

Q>Скажем, монада, которая имитирует исключения с помощью Nothing/Just. Понятно, что руками писать все эти проверки не надо, но на деле они все равно есть. Исключения, очевидно, работали бы в разы эффективнее и в GHC их таки добавили.

Q>Ну и в целом. Каждая монадная операция — это вызов bind. По коду с виду может быть все красиво, а bind в это время будет отжирать ресурсы — в parsec, вроде, такая проблема.
Речь об этом (страница 7 последний абзац)?

Q>Самый главный аргумент против — это то, что при интенсивном применении монад код становится императивным и по сути и по виду. Это не может не бесить.

Почему по сути?
now playing: Boards of Canada — Smokes Quantity
Re[31]: Is C# becoming a functional language?
От: BulatZiganshin  
Дата: 07.02.07 21:56
Оценка:
BZ>>в хаскеле они тожде не являются частью языка, и для них нет автооптимизаций, связанных с выполнением этих законов. какой удар!

Q>1) В Хаскеле есть типы классов. Без них монады практически бесполезны.

Q>2) Специальная поддержка в GHC есть.
Q>3) Монады все равно даже в GHC вносят тормоза. Бесплатно ничего не бывает.

первое. монады — это класс Monad, реализуемый в бибилиотеке. написать его может любой желающий, а для monad transformers сейчас вообще две разных библиотеки. поддержка их в языке сводится к правилам трансляции do notation. поддержка в компиляторе — куда значительней. во-первых, function guard компилируется в код, использующий монаду. во-вторых, тип "a-> IO b" на самом деле означает "a -> RealWorld -> (# RealWorld, b #)" и ghc предоставляет оптимизацию представления тпов, делающую её эквивалентной "a->b". что кстати говоря и позволяет объявить например "tell :: Int -> IO Int" хотя в девичестве он имеет тип "int(int)" или что-то типа того. однако это оптимизации универсальные и применяются точно так же к любым unboxed tuple и вероятно любому другому фантомному типу

IO & ST monads, таким образом, тормозов не вносят, а остальные — да. это ж в конце концов просто syntax sugar для скрытной передачи параметров никаких проверок/использований соблюдения monad laws нет и в помине, monadic code после desugaring компилируется как любой другой DSL
Люди, я люблю вас! Будьте бдительны!!!
Re[25]: Is C# becoming a functional language?
От: BulatZiganshin  
Дата: 07.02.07 22:29
Оценка: 60 (7)
BZ>>но ведь именно на это соображение я выше и ответил! представь себе скажем имя лог-файла, которое нужно передавать во все процедуры, поскольку запись в лог-файл может понадобиться где-то в самом низу иерархзии вызовов

VD>Представил. Теперь потрудись объяснить причем тут C#?


VD>В нем есть только два способа передать информацию — это глобальные переменные, и параметры методов.

VD>Ничего нового в C# 3.0 в этом плане не появится.

самое смешное, что в хаскеле — тоже для записи императивных алгоритмов в pure & lazy языке типа хаскела и clean используется фиктивное значение типа real world, передаваемое в и возвразаемое любой императивной процедурой. оно передаётся по цепочке от порцедуры к процедуре, и таким образом компилятор думает, что все эти процедуры можно вызывать только последовательно, в явно заданном порядке (а кодлогенератор в то же самое время думает, что real world — это туфта, и при генерации кода его просто не замечает). вот смотри, если полностью рассахарить эту IO monad:

main realworld0 = let (rw1,ch1) = getChar realworld0
(rw2,ch2) = getChar rw1
(rw3,()) = putChar rw2 ch1
in (rw3,())

этот код читает два символа и затем выводит второй из них. но второй вызов getChar невозможно опустить, поскольку для вызова putChar требуется "состояние мира". которое может возвратить только он собственно, unique types в clean — это то же самое, с явным заданием каждого "мира", получаемого и возвращаемого каждым вызовом. но используя функции высшего порядка, можно от этого избавиться:

main = getChar >>= (\ch1 -> getChar >>= (\ch2 -> putChar ch1))

а do предоставляет для этого синтаксический сахар с закосом под императивные языки:

main = do ch1 <- getChar
ch2 <- getChar
putChar ch1

т.е. обратите внимание, что do-нотация чисто синтаксически транслируется в эту последовательность вызовов >>=

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

а дальше идут monad transformers, которые представляют не просто одну монаду, а способ добавить к монаде новую функциональность. т.е. ввам не придётся например выбирать между Error monad (прекразает вычисление при возбуждении ошибки), State monad, Parsing monad (сохраняет текущее состояние бибилиотеки парсинга), а вы их можете объединить вместе, наслоив одну на другую и использовать всю необходимую вам функциональность в общем коде. более того, вы можете добавить в этот бутерброд новые монады по мере развития программы, а эта запись do с вызываемыми в ней процедурами останется неизменной

я кстати слышал о реализации энтузиастами монад для питона и схемы. так что возможно. но конечно использовать их там, как и в C* — не фунт изюму

ps: более подробно реализация IO monad описана в http://haskell.org/haskellwiki/IO_inside . один преподаватель колледжа даже говорил, что использует этот текст в своих курсах
Люди, я люблю вас! Будьте бдительны!!!
Re[23]: Is C# becoming a functional language?
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 07.02.07 22:55
Оценка: 3 (1) +1
Здравствуйте, VladD2, Вы писали:

VD>Нет это их смысл. А вот области применения определяются этим смыслом.


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

VD>В общем, приведи плиз пример где в ООЯ были бы нужны монады.


Давай начну с отмазок — я не говорил, что они нужны в ООЯ, мало того, я даже не говорил, что они в ФЯ нужны :)
Но раз ты сказал волшебное слово...

Монады можно использовать, например, в качестве альтернативы известным паттернам проектирования. Например, вместо NullObject можно взять мейби-монаду. У этого подхода есть определенные преимущества перед NullObject (впрочем, как и недостатки). В частности, нам не нужен отдельный нуль-объект.

Да, и когда будешь отвечать на этот пример, вспомни, пожалуйста, что я не говорил, что монады "нужны", чтобы мы тут не нафлеймили (а то в последнее время у нас это здорово получается). Но вот обосновать их применение, наверное, можно. Раз уж люди их применяют.
Re[25]: Is C# becoming a functional language?
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 07.02.07 23:07
Оценка:
Здравствуйте, AndrewVK, Вы писали:

L>>SelectMany == bind, имхо, остальные операторы тоже представляют собой монадические комбинаторы.


AVK>И при чем тут LINQ? SelectMany это просто статический метод в классе Sequence. То что он extension method, это просто синтаксический сахар.


Не понял претензии... А bind это просто метод в классе Monad.

AVK>Вобщем, идея о том, что LINQ это монады на мой вкус кажется крайне странной.


Я воспринял это как взгляд Erik Meijer. Почему бы и нет? Связка есть, монадические законы выполняются.
Re[28]: Is C# becoming a functional language?
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.02.07 00:39
Оценка:
Здравствуйте, EvilChild, Вы писали:

EC>Т.е., по твоему, не в чистом ФЯ от них толку нет?


Ни малейшего! Это фиговый листок позволяющий сделать вид, что язык действительно чисто-функциональный и ленивый в то время как мир с которым общается язык является императивным.

Та фразу что ты увидил, но не смог осознать, говорила о том, что натолкнуло на мысль запроса по объектам. С тем же успехом их могло натолкнуть на эту мысль что угодно. Просто люди варятся в своих мирах и черпают вдохновение из своих конекстов.

К сведению, в Лиспе похожие запросы были уже много лет.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.