среда, 23 октября 2013 г.

Написали про монады. Исправления

http://pastebin.com/5J4y252p

  1. --Есть:
  2. f x = x * x --функция
  3.  
  4. --Есть:
  5. () = M >> f(readFromFile) --монада?
  6. --что значит ()?
  7. --что такое М?
  8. --Далее: f от readFromFile? Но readFromFile это не значение, а монада.
  9. --А функция f хочет значение, она не принимает монаду.
  10. --Оператор >> пригодился бы нам, если бы тут были две монады. Но монада одна - readFromFile.
  11. --И тут из тени появляется оператор >>=, который как раз _связывает_монаду_и_функцию_.
  12.  
  13. = do
  14.     varX <- readFromFile --"получаем значение"
  15.     return (f varX)      --делаем новую монаду(return) с f от полученного значения
  16.  
  17. --так выглядит последовательность действий в do-нотации. Что там под капотом? Надо помнить что '<-' --это синтаксический сахар над >>=
  18. --Раскрывается это в следующее:
  19.  
  20. = readFromFile >>= (\varX -> return (f varX))
  21. --или
  22. = readFromFile >>= return . f
  23. --дело в том, что >>= соеденяет монаду и функцию, но не абы какую функцию, а монадическую функцию.
  24. --Как сделать простую функцию монадической? Применить к результату return.
  25. --Можно воспользоваться лямбдой, а можно использовать комбинатор.
  26. --При этом 'a -> b' превращается в 'Monad m => a -> m b',
  27. --т.е монадическую функцию, которую и хочет оператор >>= вторым аргументом.
  28.  
  29. --Надо отметить что IO это ещё и функтор, и операцию можно сократить до:
  30. = fmap f readFromFile
  31. --но это уже другая история.
  32.  
  33. --В итоге получилась монада m, которая содержит полученное из файла и умноженное на себя значение.

2 комментария:

  1. Что-то ничего не изменилось.. Правок - нет.. Я опять не туда смотрел?

    ОтветитьУдалить
  2. return (f x) -> return (f varX) в двух местах.

    ОтветитьУдалить