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
Types 值限制与类型推断_Types_F# - Fatal编程技术网

Types 值限制与类型推断

Types 值限制与类型推断,types,f#,Types,F#,我构建了一个简单的函数,在给定一个列表的情况下,该函数返回一个列表,其中输入中元素的连续出现减少为一 let rec reduce l = match l with | [] -> [] | [x] -> [x] | x::(y::_ as xs) -> if x = y then reduce xs els

我构建了一个简单的函数,在给定一个列表的情况下,该函数返回一个列表,其中输入中元素的连续出现减少为一

let rec reduce l =
match l with
| []                ->  []
| [x]               ->  [x]
| x::(y::_ as xs)   ->  if x = y then
                            reduce xs
                        else
                            x::(reduce xs)


# reduce [1;1;2;2;2;3;3;4;3;3;3];;
- : int list = [1;2;3;4;3].
# reduce [’a’;’a’;’a’;’b’];;
- : char list = [’a’; ’b’].
# reduce [];;                // The case 
- : ’a list = []

除了空列表
[]
输入之外,所有操作都按预期进行。投诉人说错误FS0030:值限制。我试图通过测试更好地理解这些现象,但我觉得我仍然不具备正确理解要点的技能。为什么泛型函数需要指定带有
[]
的大小写类型?不能简单地报告没有类型推断的结果
[]
?最后,为了处理这种情况,函数应该如何构造?

正如John在评论中所说,问题是
[]
没有向编译器提供任何关于列表类型的提示-在所有其他情况下,您知道它是一个整数字符列表,但在这里,类型未知

您无法运行涉及未知泛型类型的F#代码,因此无法运行代码并返回泛型列表-在运行代码时,需要完全指定所有类型

可以通过多种方式提供类型注释来修复类型:

reduce ([] : int list)
(reduce [] : int list)
(reduce:int list -> _) []
您还可以将调用包装到另一个可编译的泛型函数中,因为现在泛型代码位于另一个需要类型才能使用的泛型函数中:

let foo () = reduce []

但是现在您也遇到了同样的问题-在调用
foo
时需要指定类型,或者编译器需要能够从上下文推断类型,例如,如果您编写
1::foo()

,问题在于
[]
是一个
'a列表
,但是编译器需要弄清楚
'a
是什么,不能感谢@JohnPalmer的贡献。谢谢你,托马斯。由于你直截了当的解释,我现在肯定对这个问题有了更好的理解。