rapture 17.09.2011 16:12 unknown

Я сам непонял, но пытаясь мысленно спорить с чуваком http://habrahabr.ru/blogs/Haskell/128070... щас сам написал конструкцию getLine >>= return . lines которая ВНЕЗАПНО сработала. Звезда в шоке.
Вопрос:
первоначально, если брать объяснение >>= как "подогнать функцию, которая что-то сделает внутри монады и отвалит", то получается функция lines >>= getLine, которая равно (>>=) getLine lines которая нихуя не сработает, ибо >>= требует во втором аргументе функцию, возвращающую монаду. Внимание, вопрос — почему? Ответ — чтобы не замешивать чистые функции с грязыми — НИИПЕТ, ибо "мы ж из монады никуда не выбрались", а чистая функция сделала свое дело и отвалила — значение осталось в монаде.
Подходящим объяснением тут явилось бы то, что функция (lines) подвалила, >>= ей распаковала из IO String → String , та сделала String → [String] и... пиздец, потому что первый закон монад гласит "возвращать из монады ничего нельзя". А чистая функция вернула. Поэтому полученное чистое [String] нужно упаковать в тот же ящик через return, шо, собственно говоря, я и сделал (на самом деле порядок рассуждений был обратный, через (>>=) getLine lines: раз есть функция a → b, а нужна a → m b, то можно завернуть результат функции= (a→b) → (b → m b) → m b). Но как тогда с тем, что возвращать все-таки можно, а распаковывать из монады на самом деле ничего не распаковывается (правда ведь, а то я начинаю думать что UnsafePerformIO сделана не как хак, а хаком является попытка отделения чистой функции от монад путем искусственного условия невозврата)?
А я тут уже изъебался и почти придумал свое объяснение монад на освнове клеток с ящиками внутри.

1. nya 17.09.2011 16:40 Home

хаскелепроблемы

2. rapturenya /1 17.09.2011 16:46 unknown

скорее ч просто ниасилил

3. nyarapture /2 17.09.2011 16:46 Home

я тоже

4. rapturenya /3 17.09.2011 16:48 unknown

но я не хочу оставаться с неудачниками, поэтому не сдаюсь :)

Do you really want to delete ?