【问题标题】:Understanding Monad理解单子
【发布时间】:2019-11-10 11:20:45
【问题描述】:

问题

请帮助确认或更正对 Monad 是什么及其特征的理解。

作为数据类型

在我的理解中,Monad 是:

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

需要有一个 returnunit 接口来创建 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 功能吗?

参考文献

【问题讨论】:

  • 否(对您的图形),bindf (A -> M[B]) 应用于A 值“在”M[A] 值中,并产生一个组合的M[B] 值。如果我们只是mapf,我们最终会得到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


【解决方案1】:
  1. 是的,你对那些界面的东西是对的。然而,值得注意的是,在抽象中,一个 monad 应该有两个辅助方法,可以组合起来链接计算。请注意,flatMap 只是此类方法的组合 - flat 和 map。 map 可用于定义 M[A] -> M[M[B]] 类型的计算,而 flat 用于定义 M[M[B]] -> M[B]。

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

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

  4. 是的,Python 中不支持开箱即用的 monad。必须只依赖嵌套循环。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    相关资源
    最近更新 更多