[英]Ocaml - parameter type when checking for duplicates in a list
我有一个基本函数,它检查列表是否重复,如果找到则返回true,否则返回false。
# let rec check_dup l = match l with
[] -> false
| (h::t) ->
let x = (List.filter h t) in
if (x == []) then
check_dup t
else
true
;;
然而,当我尝试使用此代码时,我得到了错误
Characters 92-93:
let x = (List.filter h t) in
^
Error: This expression has type ('a -> bool) list
but an expression was expected of type 'a list
我真的不明白为什么会发生这种情况,a-> bool列表类型来自哪里?
类型('a -> bool) list
来自filter
类型和模式匹配h::t
的组合。 您要求使用列表中的单个元素h
作为要应用于列表t
每个元素的谓词 。 ML型系统无法表达这种情况。 filter
需要两个参数,一个类型为'a -> bool
,其中'a
未知,第二个参数类型为'a list
,其中'a
是与第一个参数中相同的未知类型。 所以h
必须有'a -> bool
类型, t
必须有'a list
类型。
但是你也写了h::t
,这意味着还有另一个未知的类型'b
使得h
具有类型'b
而t
具有类型'b list
。 把它放在一起,你得到这套方程式:
'a -> bool == 'b
'a list == 'b list
类型检查器会查看这个并决定'a == 'b
,从而产生更简单的问题
'a -> bool == 'a
它找不到任何解决方案,所以它很惨。
简单形式和原始方程都没有解决方案。
您可能正在寻找List.filter (fun x -> x = h) t
,使用List.exists
可能会更好。
为了完成这个答案,我在数组中发布搜索重复值的最终函数:
let lstOne = [1;5;4;3;10;9;5;5;4];;
let lstTwo = [1;5;4;3;10];;
let rec check_dup l = match l with
[] -> false
| (h::t) ->
let x = (List.filter (fun x -> x = h) t) in
if (x == []) then
check_dup t
else
true;;
当函数运行时:
# check_dup lstOne
- : bool = true
# check_dup lstTwo
- : bool = false
#
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.