Кстати, о птичках, как-то сложно сходу вникнуть в монады, но видимо это от того, что я совсем не знаком с теорией категорий и плохо знаком с абстрактной алгеброй вообще
Кстати, о птичках, как-то сложно сходу вникнуть в монады, но видимо это от того, что я совсем не знаком с теорией категорий и плохо знаком с абстрактной алгеброй вообще
оно там не надо, монады в функциональном программировании и в теркате, немножко разные вещи. Обычно для понимания монад, углублятся в глубины алгебры не требуется.
--------------------
пыщь пыщь, я идиод, убейте меня кто-нибудь, один один
оно там не надо, монады в функциональном программировании и в теркате, немножко разные вещи. Обычно для понимания монад, углублятся в глубины алгебры не требуется.
Ну вещь то одна, просто обычно в теркате несколько другие функции взяты за базовые. А вообще понять и пользоватся и "на пальцах" можно. Но если немного почитать и мозг освободить то вообще жечь можно на монадах. Только это не сразу приходит.
ghci>let double x = x + x ghci> ghci>double 1.1 2.2 ghci>let quadruple = double . double ghci> ghci>quadruple 1.1
<interactive>:1:10: No instance for (Fractional Integer) arising from the literal `1.1' at <interactive>:1:10-12 Possible fix: add an instance declaration for (Fractional Integer) In the first argument of `quadruple', namely `1.1' In the expression: quadruple 1.1 In the definition of `it': it = quadruple 1.1 ghci> ghci>:t double double :: (Num a) => a -> a ghci> ghci>:t quadruple quadruple :: Integer -> Integer ghci>
jem, Надо смотреть подробнее как вывод типов в хаскеле работает, я хаскель использую тока как пруф оф концепт, поэтому не особо в курсе. В F# это бы сломалось уже б на этом double 1.1 так как там сразу из функции double вывелся б тип Int.
зы. лечится это элементарно, просто аннотацию добавь к функции
Сообщение отредактировал Чуг&Кег - Mar 11 2010, 13:39
--------------------
пыщь пыщь, я идиод, убейте меня кто-нибудь, один один
зы. лечится это элементарно, просто аннотацию добавь к функции
Это понятно. Но вот почему автоматический вывод типов ведет себя таким странным образом - для меня непонятно. По идее, области определения и области значений этих функций должны совпадать.
Это называется Monomorphism restriction http://www.haskell.org/haskellwiki/Monomorphism_restriction Надо либо написать тип явно, либо написать это все в одном файле чтобы компилятор при компиляции видел как вы его используете и выбрал правильный тип, либо отключить Monomorphism Restriction опциями компилятора (но это не по стандарту Haskell 98).
оно там не надо, монады в функциональном программировании и в теркате, немножко разные вещи. Обычно для понимания монад, углублятся в глубины алгебры не требуется.
Цитата(Imp @ Mar 10 2010, 03:29)
Ну вещь то одна, просто обычно в теркате несколько другие функции взяты за базовые. А вообще понять и пользоватся и "на пальцах" можно. Но если немного почитать и мозг освободить то вообще жечь можно на монадах.
Таки курю теорию категорий, жду просветления
Цитата(jem @ Mar 5 2010, 15:25)
[1,2,3,4] >>= \x -> return $ [1,2,3,4] >>= \y -> return $ x * y
Это можно переписать так:
Исходный код
ghci>[1..4] >>= return . \x -> [1..4] >>= return . \y -> x * y [[1,2,3,4],[2,4,6,8],[3,6,9,12],[4,8,12,16]]
В-общем, ознакомился по диагонали, так сказать. Как и говорил Водлер: "монада - это моноид в категории эндофункторов, какие проблемы-то" А просветление, оказывается, было раньше, когда я представлял себе монады как некий механизм комбинации вычислительных процессов, аналогичный пайпам в юнихе.
В-общем, ознакомился по диагонали, так сказать. Как и говорил Водлер: "монада - это моноид в категории эндофункторов, какие проблемы-то" А просветление, оказывается, было раньше, когда я представлял себе монады как некий механизм комбинации вычислительных процессов, аналогичный пайпам в юнихе.
Ну на самом деле это только один из эффектов. Монадические эффекты могут быть самые разные. Например можно поднимать (liftM) функции в монаду Maybe.
Например можно поднимать (liftM) функции в монаду Maybe.
Дык, ясен пень, ведь монада это тройка из эндофунктора и двух естественных преобразований На практике в Хаскелле конструктор типа - это эквивалент функтора для объектов, а liftM, соответственно, играет роль функтора для морфизмов (хотя, по моему, это должен делать Functor с его fmap`ом).
Дык, ясен пень, ведь монада это тройка из эндофунктора и двух естественных преобразований На практике в Хаскелле конструктор типа - это эквивалент функтора для объектов, а liftM, соответственно, играет роль функтора для морфизмов (хотя, по моему, это должен делать Functor с его fmap`ом).
Я с практической точки зрения имел ввиду - когда на других языках приходится править код чтобы прокинуть эффект в хаскелле делаешь liftM и все готово. Правильно примененный liftM сильно упрощает работу.
Рекомендую "Structure and Interpretation of Computer Programs" классика как она есть - не совсем о ФП но примеры на Scheme в котором функциональная парадигма является основной. Позволяет заполнить пробелы в базовых знаниях и привести их в систему.