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#类型推断?_F# - Fatal编程技术网

带有数字后缀的泛型类型参数的F#类型推断?

带有数字后缀的泛型类型参数的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

在使用map、apply等更好地理解它们的同时,以下代码中推断出的泛型类型并不是我所期望的,但代码仍然有效:

注意://注释是我写的,因此我可以显示它们,但它们是Ionide打印的自动注释的精确副本

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,这对我来说很好。