OCaml 意外类型

OCaml unexpected type

我必须编写一个函数来从惰性列表中删除元素。要删除的元素的索引在列表 xs.

我不知道我应该在哪里排序xs?当我以这种方式尝试时,我得到 "Error: This expression has type..."。

type 'a llist = LNil | LCons of 'a * (unit -> 'a llist)

let rec remove xs ll =
let rec helper = 
    function
    | (_, i, LNil) -> LNil
    | (h::t, i, LCons(x, xf)) -> if h = i then helper (t, (i + 1), xf())
                                 else LCons(x, fun() -> helper (h::t, (i + 1), xf()))
    | ([], i, LCons(x, xf)) -> LCons(x, xf)
in helper (List.sort xs, 0, ll);;

(List.sort xs) 是一个接受列表和 returns 列表的函数——因为 xs 应该是对列表元素进行排序的函数;您错过了将列表作为参数传递。

...而需要一个列表。

OCaml 标准库中的

List.sort 具有以下接口:

val sort : ('a -> 'a -> int) -> 'a list -> 'a list

这意味着,它接受一个函数和一个列表。该函数的类型应为 'a -> 'a -> int,即它采用任意类型 'a 和 returns 的两个元素,一个定义参数相互顺序的 int 类型的值。第二个参数是值列表,其中每个值的类型为 'a。通常调用排序函数是:

List.sort compare [2;1;4;3]

因此,有了这些知识,我们就可以处理您的程序:

您在 xs 上调用 List.sort 这有两个结果:

  1. 类型推理系统得出 xs 是类型 'a -> 'a -> int 的函数的结论。

  2. List.sort xs 的结果是类型 'a list -> 'a list 的函数。这是因为 List.sort 需要两个参数,但您只提供了一个。