Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 如何在`for..中的联合构造函数上进行模式匹配。。在`_F#_Pattern Matching_Discriminated Union - Fatal编程技术网

F# 如何在`for..中的联合构造函数上进行模式匹配。。在`

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#列表表达式可以做的最接

在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 | _ -> () ]
如果我正确理解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']
此功能对于这些情况非常方便