Option<T> 集合的功能转换

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 等。

lou*_*ter 6

Language-ext 作者在这里,您只需调用即可.Sequence()反转内部和外部 monad:

IEnumerable<Option<int>> items = ...;

Option<IEnumerable<int>> result = items.Sequence();
Run Code Online (Sandbox Code Playgroud)

None如果序列中的任何项目是,它具有您正在寻找的返回行为NoneSome否则返回。

您还可以.Traverse(...)随时绘制结果图。


Mar*_*ann 5

函数式编程概念的“语言家族”不止一种。

在 Haskell(显然还有 Scala)中,这被称为Traversable ,并且是称为Traversable 的sequence抽象或类型类的一部分;是遍历的一个特例。sequence

还存在其他语言家族,其中最著名的是机器学习。这就是该术语的来源Option(在 Haskell 中称为Maybe)。虽然我精通 F#(这是一种 ML 方言),但我不知道遍历/序列在那里有既定的术语。