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
这有两个结果:
类型推理系统得出 xs
是类型 'a -> 'a -> int
的函数的结论。
List.sort xs
的结果是类型 'a list -> 'a list
的函数。这是因为 List.sort
需要两个参数,但您只提供了一个。
我必须编写一个函数来从惰性列表中删除元素。要删除的元素的索引在列表 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 应该是对列表元素进行排序的函数;您错过了将列表作为参数传递。
...而需要一个列表。
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
这有两个结果:
类型推理系统得出
xs
是类型'a -> 'a -> int
的函数的结论。List.sort xs
的结果是类型'a list -> 'a list
的函数。这是因为List.sort
需要两个参数,但您只提供了一个。