http://pastebin.com/3LCMbBWy
--Есть:
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, которая содержит полученное из файла и умноженное на себя значение.
вот тут - ПОНЯЛ, спасибо.
ОтветитьУдалитьНо - "закорючки" всё же :-) уж не обижайтесь на "императивщика".. Не чета "примесям"....
Удалитьdo-нотация кстати - ОСОБЕННО понятна. varX - там наверное пробел пропущен и с кейсом (регистром) напутали. Или там опять тонкости, которые я не понял?
Удалить\varX -> return (f x)
Удалить-- вот это вроде "интуитивно понятно", но хотелось бы пояснений.
m = readFromFile >>= (\varX -> return (f x))
- m - имя монады?
readFromFile - монада чтения из файла?
varX - место положения результата?
varX -> return (f x) - означает вернуть монаду, которая вызывает функцию f у которой вместо x будет подставлен varX?
>do-нотация кстати - ОСОБЕННО понятна. varX - там наверное пробел пропущен и с кейсом (регистром) напутали. Или там опять тонкости, которые я не понял?
ОтветитьУдалитьНикаких тонкостей, просто усталость. =)
Должно быть так:
http://pastebin.com/5J4y252p
>- m - имя монады?
да
>readFromFile - монада чтения из файла?
да
>varX - место положения результата?
>varX -> return (f x) - означает вернуть монаду, которая вызывает функцию f у которой вместо x будет подставлен varX?
\varX -> return (f varX) это функция, возвращающая монаду. Да.