Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --Есть:
- f x = x * x --функция
- --Есть:
- f () = M >> f(readFromFile) --монада?
- --что значит ()?
- --что такое М?
- --Далее: f от readFromFile? Но readFromFile это не значение, а монада.
- --А функция f хочет значение, она не принимает монаду.
- --Оператор >> пригодился бы нам, если бы тут были две монады. Но монада одна - readFromFile.
- --И тут из тени появляется оператор >>=, который как раз _связывает_монаду_и_функцию_.
- m = do
- varX <- readFromFile --"получаем значение"
- return (f x) --делаем новую монаду(return) с f от полученного значения
- --так выглядит последовательность действий в do-нотации. Что там под капотом? Надо помнить что '<-' --это синтаксический сахар над >>=
- --Раскрывается это в следующее:
- m = readFromFile >>= (\varX -> return (f x))
- --или
- m = readFromFile >>= return . f
- --дело в том, что >>= соеденяет монаду и функцию, но не абы какую функцию, а монадическую функцию.
- --Как сделать простую функцию монадической? Применить к результату return.
- --Можно воспользоваться лямбдой, а можно использовать комбинатор.
- --При этом 'a -> b' превращается в 'Monad m => a -> m b',
- --т.е монадическую функцию, которую и хочет оператор >>= вторым аргументом.
- --Надо отметить что IO это ещё и функтор, и операцию можно сократить до:
- m = fmap f readFromFile
- --но это уже другая история.
- --В итоге получилась монада m, которая содержит полученное из файла и умноженное на себя значение.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement