All About Monads 阅读笔记
很精彩、也很容易懂的 tutorial, 强烈建议 :-)
Part I Understanding Monads
通过例子引入 monad, 介绍了 monad 的各种用法以及 Haskell 标准库定义的一些和 monad 有关的 type class 及函数。
一、为什么使用 Monad?
For the programmer, monads are useful tools for structuring functional programs. They have three properties that make them especially useful:
- Modularity - They allow computations to be composed from simpler computations and separate the combination strategy from the actual computations being performed.
- Flexibility - They allow functional programs to be much more adaptable than equivalent programs written without monads. This is because the monad distills the computational strategy into a single place instead of requiring it be distributed throughout the entire program.
- Isolation - They can be used to create imperative-style computational structures which remain safely isolated from the main body of the functional program. This is useful for incorporating side-effects (such as I/O) and state (which violates referential transparency) into a pure functional language like Haskell.
作者已经总结的很好了,我就直接抄上来 :-)
二、The Monad class
1) 定义
class Monad m where
(>>=) :: m a -> (a -> m b) -> m b
return :: a -> m a
|
一个 monad 必须且只需定义 (>>=) 和 return.
2)The Monad laws
1. (return x) >>= f == f x
2. m >>= return == m
3. (m >>= f) >>= g == m >>= (\x -> f x >>= g)
|
编译器不会检查用户自定义的 monad 是否满足 monad laws, 需要程序员自己保证这点。若用户自定义的 monad 不满足 monad laws, 则在 do-notation 中或其他地方使用该 monad 时可能出现异常行为。
关于 monad law, 上的 讲的相当精彩(包括不满足 monad law 可能引起的问题),建议参考。
用户自定义的 monad 最好作为 Monad class 的实例(instance),原因如下:
1. 由于使用了标准的记号,则代码的可读性会更好;
2. 可以使用 Haskell 内置的对 monad 的支持,例如 do-notation;
3. 可以使用 Prelude 及其他标准库中定义的一些针对 monad 的函数。
Part II A Catalog of Standard Monads
依次介绍了 Haskell 标准库中的 monad, 包括:
- Identity - 用于 monad transformer
- Maybe - 用于可能不会产生返回值的计算
- Error - 用于可能失败或抛出异常的计算
- [](List) - 用于可能返回多个值的不确定计算
- IO - 用于实现 IO
- State - 用于带状态的计算
- Reader - 用于共享环境(environment)的计算
- Writer - 用于可生成额外数据的计算
- Cont - 用于 CPS(continuation-passing style)
这部分的介绍最好能结合 Haskell 98 Report 的相关部分来看。
Part III Monads in the Real World
在实际使用中,往往需要同时使用多个 monad,Haskell 将这种做法抽象为 monad transformer。这部分除了介绍 monad transformer 的概念外,还介绍了其实现及一些标准库提供的 monad transformers。
要真正掌握 monad 及其用法,除了学习其理论之外,自己在实际编码中使用以及研究别人使用的例子也是必不可少的。
阅读(1723) | 评论(0) | 转发(0) |