【发布时间】:2021-03-22 04:14:32
【问题描述】:
我正在寻找一个标准的 F# 函数,它接受一个二选一序列并返回一对序列:
let separate (choices : seq<Choice<'T1, 'T2>>) : seq<'T1> * seq<'T2> = ...
一个简单的实现非常简单:
let separate choices =
let ones =
choices
|> Seq.choose (function
| Choice1Of2 one -> Some one
| _ -> None)
let twos =
choices
|> Seq.choose (function
| Choice2Of2 two -> Some two
| _ -> None)
ones, twos
这工作正常,但迭代序列两次,这不太理想。此函数是否在半标准库之一中定义?我环顾四周,但找不到。 (如果它存在,我相信它会使用其他名称。)
对于奖励积分,适用于 3 选择、4 选择等的版本也很好,List、Array 等的版本也很好。谢谢。
【问题讨论】:
-
在 Haskell 中是
partitionEithers或unzipEithers(hoogle),但我在 FSharpx 或 FSharpPlus 中找不到任何具有此类签名的东西 -
在 F# 中是
partitionMap id+ fsprojects.github.io/FSharpPlus//extensions.html#Partitioning -
啊,我认为你是对的。看起来
partitionMap id将匹配我的要求,(尽管它不支持序列)。感谢您找到它!
标签: f#