F# 如何在`for..中的联合构造函数上进行模式匹配。。在`
在Haskell中,如果我有一个联合类型值列表,如下所示:F# 如何在`for..中的联合构造函数上进行模式匹配。。在`,f#,pattern-matching,discriminated-union,F#,Pattern Matching,Discriminated Union,在Haskell中,如果我有一个联合类型值列表,如下所示: let lefts example = [ for e in example do match e with Choice1Of2 l -> yield l | _ -> () ] 示例::[整型字符] 示例=[左3,右'b',左6,左9,右'c'] 我可以使用一个小“技巧”来提取与特定模式匹配的所有结果: lefts::[Int] lefts=[l | Left l我认为使用F#列表表达式可以做的最接
let lefts example =
[ for e in example do
match e with Choice1Of2 l -> yield l | _ -> () ]
示例::[整型字符]
示例=[左3,右'b',左6,左9,右'c']
我可以使用一个小“技巧”来提取与特定模式匹配的所有结果:
lefts::[Int]
lefts=[l | Left l我认为使用F#列表表达式可以做的最接近的事情如下:
let lefts example =
[ for e in example do
match e with Choice1Of2 l -> yield l | _ -> () ]
如果我正确理解Haskell代码,则|
之后的部分不仅用作提取器,还用作过滤器-隐式跳过所有与模式不匹配的内容
F#在列表表达式中没有相同的概念,因此必须更加详细。在这里,我们只需使用for
对所有项进行迭代,然后显式使用yield
为源列表中的每个Choice1Of2
生成一个新值(我们只需跳过任何其他内容)
根据您正在做的事情,使用列表。选择(如Gustavo的回答中所述)可能更容易。但上述内容可能最接近Haskell的理解语法。在F#中,如果您不匹配所有情况,您将在所有情况下收到警告
因此,您可以在表达式中使用两种情况编写匹配,但对于您的示例,而不是理解,我将使用函数列表。选择:
let example = [Choice2Of2 3; Choice1Of2 'b'; Choice2Of2 6; Choice2Of2 9; Choice1Of2 'c']
List.choose (function (Choice1Of2 x) -> Some x | _ -> None) example
// val it : char list = ['b'; 'c']
此功能对于这些情况非常方便