【发布时间】:2021-09-24 22:31:03
【问题描述】:
我在 f# 中有以下非常简单的函数:
let private addOnsFromDto (addOns: MyType1 []) =
let typedList = List.empty<MyType2>
match addOns with
| null -> typedList
| _ -> List.map<MyType1 , MyType2> (fun a -> MyType2.create a.Prop1 a.Prop2)
f# 编译器抱怨此错误消息:
All branches of a pattern match expression must return values of the same type as the first branch, which here is 'MyType2 list'. This branch returns a value of type 'MyType1 list -> MyType2 list'.
我知道在第一个分支上我有一个“MyType2 列表”。我知道在第二个分支上我有一个从列表映射到列表“MyType2 列表”的函数,因此编译器抱怨两个分支之间的类型不一致是有道理的。
但是,鉴于第二个分支的输出与第一个分支的输出类型相同,我希望编译器正常。我是否需要做一些事情来“强制”评估 List.map 函数,以便这两种类型是等价的?如果是这样,我该如何实现?
解决方案
对于任何认为有用的解决方案的人,正如有用的答案所解释的那样,我需要将原始列表通过管道传输到 map 函数中,以便提供两个参数。
let private addOnsFromDto (addOns: MyType1 []) =
let typedList = List.empty<MyType2>
match addOns with
| null -> typedList
| _ -> addOns
|> Array.toList
|> List.map<MyType1 , MyType2> (fun a -> MyType2.create a.Prop1 a.Prop2)
【问题讨论】:
-
不,输出不一样:第一个分支返回一个列表,第二个分支返回一个函数。不是列表,是函数。这里有一个提示:
List.map接受两个参数,而不是一个。