主要观点:在编程语言领域,常有一种观点认为“Haskell 有 monads”且这是其独特之处,实则 monad 更多是库设计问题而非语言设计问题。从 ML 角度看,monad 只是模块的一种特定用法,通过结构可表示 monad,标准模块化编程技术足以表示 monad 且适用于其他感兴趣的签名,还可将模块集成到 ML 的类型推断机制中。Haskell 的 IO monad 可通过设计标准基础库模块的签名来实现,Carnegie Mellon 学生已完成相关实践并设计了更好的语法扩展。ML 模块系统可用于实现 Haskell 中默认的效果隔离,但这并非好主意,因为进入 IO monad 后会陷入 Algol 式的命令式编程,难以在函数式和 monadic 风格间转换且失去良性效果的概念。总之,ML 也有 monads,是否使用取决于使用者,且不是语言设计者强制的。
关键信息:
- monad 是一种程序结构设备,Haskell 推广了其使用但并非语言特有。
- ML 中 monad 可由结构表示,标准模块化技术适用,还可集成到类型推断机制。
- Haskell 的 IO monad 可通过设计基础库模块签名实现,已有人实践并设计语法扩展。
- ML 虽可实现类似效果隔离但不是好主意,进入 IO monad 后编程受限。
重要细节: - monad 的签名为
signature MONAD = sig type 'a monad val ret : 'a -> 'a monad val bnd : 'a monad -> ('a -> 'b monad) -> 'b monad end
。 - 以
structure Option : MONAD = struct type 'a monad = 'a option fun ret x = SOME x fun bnd (SOME x) k = k x | bnd NONE k = NONE end
为例说明简单的 monad 结构。 - 如参考单元的签名
signature REF = sig type 'a ref val ref : 'a -> 'a ref IO.monad val! : 'a ref -> 'a IO.monad val := : 'a ref -> 'a -> unit IO.monad end
可将效果推入 IO monad。 - 两年前 Carnegie Mellon 学生 Phillippe Ajoux 已完成相关实践并编写程序,还设计了更好的语法扩展。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。