The "Monad" class in Haskell defined two basic operatos: ">>=" (bind) and "return".
infixl 1 >>, >>=
class Monad m where
(>>=) :: m a -> (a -> m b) -> m b
(>>) :: m a -> m b -> m b
return :: a -> m a
fail :: String -> m a
m >> k = m >>= /_ -> k
The bind operations, >> and >>=, combine two monadic values while the "return" operation injects a value
into the monad (container).
Monad is a container, like room. A room, we can place some furniture, such as chest. There may be some
drawers in a chest. They all are containers because we can put some things into them. From this example,
it is easy to understand what is a monad type.
OK. Let's come back. The signature of >>= helps us to understand this operation: ma >>= /v -> mb combines
a monadic value "ma" containing values of type "a" and a function which operates on a value "v" of type "a",
returning the monadic value "mb". The result is to combine "ma" and "mb" into a monadic value containing "b".
The ">>" function is used when the function does not need the value producted by the first monadic operator.
The precise meaning of binding depends, of course, on the monad. For example, in the IO monad, x >>= y
performs two actions sequentially, passing the result of the first into the second. For the other built-in
monads,lists and the "Maybe" type,these monadic operations can be understood in terms of passing zero or
more values from one calculation to the next.
The "do" syntax provides a simple shorthand for chains of monadic operations. The essential translation of
"do" is captured in the following two rules:
do e1 ; e2 = e1 >> e2
do p <- e1; e2 = e1 >>= /p -> e2
When the pattern in this second form of "do" is refutable, pattern match failure calls the fail operation.
This may raise an error (as in the IO monad) or return a "zero"(as in the list monad).
do p <- e1; e2 = e1 >>= (/v -> case v of p -> e2; _ -> fail "s")
Thus the more complex translation is the above.
本文介绍了 Haskell 中 Monad 类的基本概念,包括 bind 和 return 操作符的功能及使用方式,并通过示例帮助理解 Monad 的容器特性。此外,还讲解了 do 语法如何简化 Monad 链接操作。
799

被折叠的 条评论
为什么被折叠?



