【发布时间】:2019-11-10 11:20:45
【问题描述】:
问题
请帮助确认或更正对 Monad 是什么及其特征的理解。
作为数据类型
在我的理解中,Monad 是:
- 一个容器,可以容纳任何类型的T和
- 提供绑定接口,允许其客户端应用平面地图功能和
- 将其内容投影到任何类型 T' 的另一个 Monad 中。
需要有一个 return 或 unit 接口来创建 T 类型的 Monad。
unit:= T -> M[T]
在 Scala 中,List() 或 Set() 是 return 接口的示例,任何 Scala 序列类型(Array、List、Map、String)都是提供 flatMap 接口,即绑定。
这些正确吗?
作为设计模式
软件工程提供了管理复杂性或结构化软件的方法,例如无需 goto 的结构化编程、UNIX 管道到管道转换、面向对象封装数据和控制访问等。
Monad 是一种设计模式,它提供了一种将计算构造为链的方法吗?
在其他系统中
UNIX 命令
我想 UNIX 命令例如cat, grep 是可以链接的函数,但这并不意味着它们是 Monad,它们不是 Monad,因为它们没有 return/unit 也不是数据类型。或者它仍然被视为例如IO Monad 如Monadic i/o and UNIX shell programming?
Python
我相信 Python 中没有开箱即用的 bind 或 Scala flatMap 等价物。我可以说 Python 没有开箱即用的 Monad 功能吗?
参考文献
【问题讨论】:
-
否(对您的图形),
bind将f (A -> M[B])应用于A值“在”M[A]值中,并产生一个组合的M[B]值。如果我们只是map和f,我们最终会得到M[M[B]],但是单子绑定“拼接”那些M[B]s 在组合M[B]中:twice_each [x,y,z] = [x,x] ++ [y,y] ++ [z,z]或twice_each xs: for x in xs: for a in [x,x]: yield a。
标签: monads