List 从选项列表中获取值列表

List 从选项列表中获取值列表,list,f#,List,F#,我有一个简单的字符串选项列表,如下所示: let myList = [ None; Some "foo"; Some "bar" ] 我尝试使用以下方法从列表中获取非空值: myList |> List.filter Option.isSome |> List.map Option.get 但后来我在互联网上找到了另一个代码: myList |> List.choose id 他们都做完全相同的事情。这两个代码示例之间是否存在性能差

我有一个简单的字符串选项列表,如下所示:

let myList = [ None; Some "foo"; Some "bar" ]
我尝试使用以下方法从列表中获取非空值:

myList
|> List.filter Option.isSome
|> List.map Option.get
但后来我在互联网上找到了另一个代码:

myList
|> List.choose id

他们都做完全相同的事情。这两个代码示例之间是否存在性能差异?或者只是关于代码偏好?

您的第一个代码过滤器+映射执行以下操作:

递归地循环通过myList applying Option.Is这里对每个项进行一些函数模式匹配,并在函数返回true的地方构建一个新的项列表

[一些食物;一些酒吧]

递归地循环使用新的list application Option.get函数,并将模式匹配到每个项,并构建从函数返回的值的另一个新列表

[foo;bar]

第二种方法是:

递归地遍历myList,将id函数应用于每个项,并构建一个新的项列表,其中函数仅返回一个模式匹配 因此,所完成的工作减少了两倍,编写和维护的代码也减少了很多


choose是一种惯用的“展开”选项的方法,跳过那些没有的选项。这就是它存在于所有收集模块中的原因。

您的第一个代码过滤器+映射执行以下操作:

递归地循环通过myList applying Option.Is这里对每个项进行一些函数模式匹配,并在函数返回true的地方构建一个新的项列表

[一些食物;一些酒吧]

递归地循环使用新的list application Option.get函数,并将模式匹配到每个项,并构建从函数返回的值的另一个新列表

[foo;bar]

第二种方法是:

递归地遍历myList,将id函数应用于每个项,并构建一个新的项列表,其中函数仅返回一个模式匹配 因此,所完成的工作减少了两倍,编写和维护的代码也减少了很多


choose是一种惯用的“展开”选项的方法,跳过那些没有的选项。这就是为什么它存在于所有收集模块中。

我认为第二个选项应该工作得更快,因为它只遍历列表一次。我认为第二个选项应该工作得更快,因为它只遍历列表一次。