OCaml意外类型

时间:2015-11-30 19:13:24

标签: ocaml

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

我不知道应该在哪里排序xs?当我以这种方式尝试时,我得到“错误:此表达式具有类型......”。

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);;

2 个答案:

答案 0 :(得分:1)

来自OCaml标准库的

List.sort具有以下界面:

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

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

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

因此,凭借这些知识,我们可以解决您的计划:

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

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

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

答案 1 :(得分:0)

(List.sort xs)是一个带有列表和列表的函数。返回一个列表 - 因为xs应该是对列表元素进行排序的函数;你错过了一个列表作为arg。

...而预期列表。