вторник, 22 октября 2013 г.

Написали про монады

http://pastebin.com/3LCMbBWy


  • --Есть:
  • f x = x * x --функция
  •  
  • --Есть:
  • () = M >> f(readFromFile) --монада?
  • --что значит ()?
  • --что такое М?
  • --Далее: f от readFromFile? Но readFromFile это не значение, а монада.
  • --А функция f хочет значение, она не принимает монаду.
  • --Оператор >> пригодился бы нам, если бы тут были две монады. Но монада одна - readFromFile.
  • --И тут из тени появляется оператор >>=, который как раз _связывает_монаду_и_функцию_.
  •  
  • = do
  •     varX <- readFromFile --"получаем значение"
  •     return (f x)         --делаем новую монаду(return) с f от полученного значения
  •  
  • --так выглядит последовательность действий в do-нотации. Что там под капотом? Надо помнить что '<-' --это синтаксический сахар над >>=
  • --Раскрывается это в следующее:
  •  
  • = readFromFile >>= (\varX -> return (f x))
  • --или
  • = readFromFile >>= return . f
  • --дело в том, что >>= соеденяет монаду и функцию, но не абы какую функцию, а монадическую функцию.
  • --Как сделать простую функцию монадической? Применить к результату return.
  • --Можно воспользоваться лямбдой, а можно использовать комбинатор.
  • --При этом 'a -> b' превращается в 'Monad m => a -> m b',
  • --т.е монадическую функцию, которую и хочет оператор >>= вторым аргументом.
  •  
  • --Надо отметить что IO это ещё и функтор, и операцию можно сократить до:
  • = fmap f readFromFile
  • --но это уже другая история.
  •  
  • --В итоге получилась монада m, которая содержит полученное из файла и умноженное на себя значение.
  • 5 комментариев:

    1. Ответы
      1. Но - "закорючки" всё же :-) уж не обижайтесь на "императивщика".. Не чета "примесям"....

        Удалить
      2. do-нотация кстати - ОСОБЕННО понятна. varX - там наверное пробел пропущен и с кейсом (регистром) напутали. Или там опять тонкости, которые я не понял?

        Удалить
      3. \varX -> return (f x)
        -- вот это вроде "интуитивно понятно", но хотелось бы пояснений.
        m = readFromFile >>= (\varX -> return (f x))

        - m - имя монады?
        readFromFile - монада чтения из файла?
        varX - место положения результата?
        varX -> return (f x) - означает вернуть монаду, которая вызывает функцию f у которой вместо x будет подставлен varX?

        Удалить
    2. >do-нотация кстати - ОСОБЕННО понятна. varX - там наверное пробел пропущен и с кейсом (регистром) напутали. Или там опять тонкости, которые я не понял?

      Никаких тонкостей, просто усталость. =)
      Должно быть так:
      http://pastebin.com/5J4y252p

      >- m - имя монады?
      да

      >readFromFile - монада чтения из файла?
      да

      >varX - место положения результата?

      >varX -> return (f x) - означает вернуть монаду, которая вызывает функцию f у которой вместо x будет подставлен varX?

      \varX -> return (f varX) это функция, возвращающая монаду. Да.

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