了解Monad

时间:2019-11-10 11:20:45

标签: monads

问题

请帮助确认或纠正对Monad及其特征的理解。

作为数据类型

据我所知,一个Monad是:

  1. 可以容纳任何T型和
  2. 的容器
  3. 提供一个 bind 界面,该界面允许其客户端应用平面地图功能,并且
  4. 将其内容投影到另一个T'类型的Monad中。

需要有一个返回单位界面来创建T型Monad。

unit:= T -> M[T]

enter image description here

在Scala中,List()或Set()是 return 接口的示例,任何Scala序列类型(数组,列表,映射,字符串)都是Monad,它们提供 flatMap < / strong>界面,该界面绑定

这些对吗?

作为设计模式

软件工程提供了管理复杂性或构建软件的方法,例如无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功能吗?

参考

1 个答案:

答案 0 :(得分:0)

  1. 是的,您对这些界面方面的看法是正确的。但是,值得注意的是,在抽象上,单子应具有两种辅助方法,可以将它们组合起来以链接计算。请注意,flatMap只是这些方法的组成部分-flat和map。映射可用于定义类型为M [A]-> M [M [B]]的计算,而平面则用于定义M [M [B]]-> M [B]。

  2. 是的,在Scala中,它们是链接计算的一种方式。

  3. shell脚本命令可以实现monad的目的(在所考虑的类比中),但仍然不能被视为monad(至少对我来说是这样),因为它们不一定符合第1点。 / p>

  4. 是的,Python不支持开箱即用的monad。一个人必须仅依赖嵌套循环。