Mar*_*per 4 c# monads haskell functional-programming scala
我有一个实例集合Option<T>,想要从 转换IEnumerable<Option<T>>为Option<IEnumerable<T>>
如果所有选项都有值,那么我想要一个Some<IEnumerable<T>>包含收集值的值,如果集合中的任何项目都是None,那么我想要一个None<IEnumerable<T>>
这似乎是一个相当常见的函数转换,但我不确定它是否存在于主流函数库中,或者它会被称为什么。看起来与 类似FlatMap,但不完全一样,因为我不想只过滤掉这些None值。
我可以自己实现它,但想知道它是否已经作为功能构造存在。不介意什么语言,C#、Scala、Haskell 等。
Language-ext 作者在这里,您只需调用即可.Sequence()反转内部和外部 monad:
IEnumerable<Option<int>> items = ...;
Option<IEnumerable<int>> result = items.Sequence();
Run Code Online (Sandbox Code Playgroud)
None如果序列中的任何项目是,它具有您正在寻找的返回行为None,Some否则返回。
您还可以.Traverse(...)随时绘制结果图。
函数式编程概念的“语言家族”不止一种。
在 Haskell(显然还有 Scala)中,这被称为Traversable ,并且是称为Traversable 的sequence抽象或类型类的一部分;是遍历的一个特例。sequence
还存在其他语言家族,其中最著名的是机器学习。这就是该术语的来源Option(在 Haskell 中称为Maybe)。虽然我精通 F#(这是一种 ML 方言),但我不知道遍历/序列在那里有既定的术语。
| 归档时间: |
|
| 查看次数: |
868 次 |
| 最近记录: |