【问题标题】:Maybe Monad: Why flatMap is flat?也许 Monad:为什么 flatMap 是平面的?
【发布时间】:2019-02-03 12:58:07
【问题描述】:

读完这篇关于 Typescript 中 monad 的精彩文章后: https://codewithstyle.info/advanced-functional-programming-in-typescript-maybe-monad/ 我觉得我已经设法掌握了除了这个问题的主题之外的所有内容。

有人可以解释为什么flatMap()map() 不同,因为唯一的区别是前者接受带有Maybe 作为返回值的lambda?

我完全理解为什么数组可以“扁平化”,但我无法将“扁平化”的含义应用于 monad。

【问题讨论】:

  • 您是在问为什么它被称为“平面地图”,或者它的行为方式为何?
  • 嗨!我想知道为什么它会这样称呼。请参阅我刚刚添加到问题中的最后一行。

标签: typescript functional-programming monads


【解决方案1】:

假设我有一个 Maybe m: Maybe<Int> 和一个函数 f: Int => Maybe<String>。现在m.map(f) 的类型将是Maybe<Maybe<String>>m.flatMap(f) 的类型将只是 Maybe<String>。所以就像将一个数组扁平化为一个数组一样,在Maybes 上使用flatMap 而不是map 将可能的可能变成普通的可能。

【讨论】:

  • 现在我觉得自己像个白痴。谢谢。 :-) 就是这么简单。但是我还没有意识到 map 和 flatMap 之间的真正区别,但这是一个不同的故事。谢谢!
  • @NurbolAlpysbayev 如果你有一个函数flatten<T>(m: Maybe<Maybe<T>>): Maybe<T>,比如flatten(Some(None)) = Noneflatten(None) = Noneflatten(Some(Some(x))) = Some(x),那么m.flatMap(f)等于flatten(m.map(f))(对于那些f,其中m.flatMap(f) 类型正确)。因此,除了map 也适用于不产生可能的函数之外,区别与在结果上调用flatten 相同。另一种思考方式是Some(x).map(f) 总是会产生另一个Some,而flatMap 可能会产生None
  • 还可能值得注意的是,flatMapselectMany(它曾经被称为,源于 .NET 实现)只是语言中 bind 运算符的其他名称像哈斯克尔。所有其他一元运算符可以使用bind/selectMany/flatMap来实现。例如,过滤器可以实现为flatMap,其中选择器返回空集合或包含原始项目的集合,具体取决于是否满足谓词。
  • 重点是“flatMap”比展平数组和映射可能要强大得多。它是现代函数式编程的数学支柱。
  • selectMany == flatMap。您可以忽略 selectMany,除非您使用 Rx 或 Ix for .NET。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-24
  • 1970-01-01
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
  • 2011-07-01
相关资源
最近更新 更多