Ocaml 这不是一个函数;它无法应用

Ocaml 这不是一个函数;它无法应用,ocaml,Ocaml,我是OCaml的新手,我尝试创建一个函数来查看列表x是否是y的子集,我不确定我会错在哪里。我读过很多类似的问题,它们都把类型冲突列为原因,但我不确定哪里有冲突 # let header x = List.hd x;; val header : 'a list -> 'a = <fun> # let matcher x y = List.mem x y;; val matcher : 'a -> 'a list -> bool = <fun> # let

我是OCaml的新手,我尝试创建一个函数来查看列表x是否是y的子集,我不确定我会错在哪里。我读过很多类似的问题,它们都把类型冲突列为原因,但我不确定哪里有冲突

# let header x = List.hd x;;
val header : 'a list -> 'a = <fun>
# let matcher x y = List.mem x y;;
val matcher : 'a -> 'a list -> bool = <fun>
# let tailer x = List.tl x;;
val header : 'a list -> 'a = <fun>
# let rec sub x y =
  if ((List.length x) == 0) then true
  else if (matcher (header x) y) then sub((tailer x) y)
  else false;;
Error: This expression has type 'a list
       This is not a function; it cannot be applied.
#让标题x=List.hd x;;
val标题:“a列表->”a=
#让matcher x y=List.mem x y;;
val matcher:'a->'a list->bool=
#设tailer x=List.tl x;;
val标题:“a列表->”a=
#让rec sub x y=
如果((List.length x)==0),则为真
否则,如果(匹配器(头x)y),则子((尾x)y)
否则为假;;
错误:此表达式的类型为“a列表”
这不是一个函数;它无法应用。
在rec sub x y中,我可以为空列表x返回'true',在x的list.tl上重做sub,也就是没有头部的列表(据我所知),或者如果我无法在y中找到x的当前头部,只返回false。递归最终将导致true或false,因此我看不出哪里会出现类型冲突

sub((tailer x) y)
外圆括号表示将
y
应用于
tailer x
的结果。错误消息告诉您,此结果是一个列表,而不是一个函数。这也意味着您只向“sub”传递了一个参数,即将
y
应用于
tailer x
的结果

我不完全确定您为什么认为这些括号是必要的,但似乎您把它与C风格的函数应用程序混淆了,只需删除它们就可以解决错误


还值得注意的是,由于咖喱的缘故,
(tailer x)y
tailer x y
是等价的。所以你的意思是
sub(tailer x y)
或者
sub(tailer x)y
。无论哪种情况,括号都太多。

为了获得最佳结果,我建议您仅通过模式匹配访问列表元素。您甚至可能不需要使用
列表
模块中的函数。例如,您可以使用
match。。。与[]->……|head::tail->…
(在表达式
fx
中,
f
被应用于
x
。您似乎将此向后。在
中(tailer x)y
tailer x
被应用于
y
@JeffreyScofield嗯,是的,对我来说,将参数应用于函数比将函数应用于参数更有意义。所以我想说
x
y
都应用于
tailer
,而不是
tailer
被应用于
x
>和
tailer x
y
。我可以看出后者在理论上更有意义,但你认为在其他方面差异是否显著?