带有数字后缀的泛型类型参数的F#类型推断?
在使用map、apply等更好地理解它们的同时,以下代码中推断出的泛型类型并不是我所期望的,但代码仍然有效: 注意://注释是我写的,因此我可以显示它们,但它们是Ionide打印的自动注释的精确副本带有数字后缀的泛型类型参数的F#类型推断?,f#,F#,在使用map、apply等更好地理解它们的同时,以下代码中推断出的泛型类型并不是我所期望的,但代码仍然有效: 注意://注释是我写的,因此我可以显示它们,但它们是Ionide打印的自动注释的精确副本 let map2 fOk fErr (a : Result<'a,'e>) (b : Result<'b,'e>)= // ('a -> 'b -> 'a0) -> ('e -> 'e -> 'e) -> Result<'a,'e&g
let map2 fOk fErr (a : Result<'a,'e>) (b : Result<'b,'e>)= // ('a -> 'b -> 'a0) -> ('e -> 'e -> 'e) -> Result<'a,'e> -> Result<'b,'e> -> Result<'a,'e>
match a, b with
| Ok aOk, Ok bOk -> fOk aOk bOk |> Ok
| Error aErr, Error bErr -> fErr aErr bErr |> Error
| Error aErr, _ -> Error aErr
| _, Error bErr -> Error bErr
let lift2ResultFromMap2 f= // ('a -> 'b -> 'c) -> (Result<'a,'d list> -> Result<'b,'d list> -> Result<'c,'d list>)
map2 f List.append
让map2 fOk fErr(a:Result)(b:Result)=/('a->'b->'a0)->('e->'e->'e)->结果->结果->结果
将a、b与
|好的,好的->好的,好的
|Error aErr,Error bErr->fErr aErr bErr |>Error
|错误aErr,->错误aErr
|_u3;,错误bErr->错误bErr
让lift2ResultFromMap2 f=/('a->'b->'c)->(结果->结果->结果)
map2 f List.append
在这里,我希望map2
的返回类型是Result
,而不是Result
。
但是当我使用它来定义lift2ResultFromMap2
时,返回类型正是我所期望的,Result
而不是map2所建议的Result
我认为这是一个IDE错误,对吗?或者编号的后缀是否还有其他类似通配符的含义?首先考虑您的约束。 现在,对于您的示例,它尝试为第一个无约束值选择
'a
,这是fOk
的返回类型,saw'a
已经在使用,因此它使用'a0
。因此,如果让它通过以下方式拾取约束:
(a : Result<_,'e>) (b : Result<_,'e>)
(a:结果)
fOk
将被推断为'a->'b->'c
。如果您有足够的值来推断多达'e
,那么您最终会看到'e0
a0
并不特殊-这只是您约束输入类型的结果,因此返回类型是基于与之交互的值计算的。如果您通过使用(a:Result)
放松约束,您会发现fOk
变成'a->'b->'c
。我明白了,那么返回类型差异很可能只是一个bug。特别是如果我删除了所有类型约束,那么返回类型将成为Result。请注意,虽然对于fOk,a0改为c,但是对于返回类型,a改为cIt,这并不是一个bug,让我写一个例子。我明白了这一点,但引起最初困惑的是,根据这一点,推断出的约束与函数的功能并不一致。根据是否与我的用户定义的约束冲突,它推断整个map2
函数最后一个最终结果的Ok将与fOk的第一个参数的类型相同,或者如果没有用户定义的约束,它推断整个map2
函数的最后一个最终结果Ok将与fOkOkay的结果相同,这可能是Ionide方面的错误。我在VS2019,这对我来说很好。