繁体   English   中英

Ocaml - 检查列表中重复项时的参数类型

[英]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具有类型'bt具有类型'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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM