我必须编写一个函数来从惰性列表中删除元素。要删除的元素的索引位于列表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);;
答案 0 :(得分:1)
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
这有两个后果:
类型推断系统得出结论:xs
是'a -> 'a -> int
类型的函数。
List.sort xs
的结果是'a list -> 'a list
类型的函数。这是因为List.sort
需要两个参数,但是您只提供了一个参数。
答案 1 :(得分:0)
(List.sort xs)是一个带有列表和列表的函数。返回一个列表 - 因为xs应该是对列表元素进行排序的函数;你错过了一个列表作为arg。
...而预期列表。