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的贡献。谢谢你,托马斯。由于你直截了当的解释,我现在肯定对这个问题有了更好的理解。