- Haskell 教程
- Haskell - 主页
- Haskell - 概览
- Haskell - 环境设置
- Haskell - 基本数据模型
- Haskell - 基本运算符
- Haskell - 决策
- Haskell - 类型和类型类
- Haskell - 函数
- Haskell - 函数的更多内容
- Haskell - 函数组合
- Haskell - 模块
- Haskell - 输入和输出
- Haskell - 函子
- Haskell - 单子
- Haskell - 拉链
- Haskell 有用资源
- Haskell - 快速指南
- Haskell - 有用资源
- Haskell - 讨论
Haskell - 单子
单子不过是一种具有额外功能的应用函子类型。它是一种类型类,支配着被称为单子规则的三个基本规则。
所有三个规则严格适用于一个如下所示的单子声明:
class Monad m where return :: a -> m a (>>=) :: m a -> (a -> m b) -> m b (>>) :: m a -> m b -> m b x >> y = x >>= \_ -> y fail :: String -> m a fail msg = error msg
适用于一个单子声明的三条基本定律如下:
左同一律 - return 函数不改变值,它不应改变单子中的任何内容。它可以表示为“return >=> mf = mf”。
右同一律 - return 函数不改变值,它不应改变单子中的任何内容。它可以表示为“mf >=> return = mf”。
结合律 - 根据此定律,函子和单子实例都应以相同的方式工作。它可以用数学表达式“(f >==>g)>=> h =f >= >(g >=h)”表示。
前两条定律重复了同一观点,即在 bind 运算符的两侧,return 应具有恒等行为。
在以前面的示例中,我们已经使用了大量单子,而没有意识到它们是单子。考虑采用列表单子生成特定列表的以下示例。
main = do print([1..10] >>= (\x -> if odd x then [x*2] else []))
此代码将产生以下输出:
[2,6,10,14,18]
广告