这不是功能;它不能被应用

时间:2019-10-09 07:53:08

标签: 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 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.

在rec sub xy中,我可以为空列表x返回'true',在x的List.tl上重做sub,也就是没有头的列表(根据我的理解),或者如果返回false我找不到y中x的当前头。递归最终将导致对或错,所以我看不到类型冲突可能发生的地方。

1 个答案:

答案 0 :(得分:0)

sub((tailer x) y)

外部括号表示您正在将y应用于tailer x的结果。错误消息告诉您该结果是'a list,而不是函数。这也意味着您只将一个参数传递给'sub',这是将y应用于tailer x的结果。

我不确定您为什么相信这些括号是必要的,但是您似乎将其与C样式函数应用程序混淆了,只需删除它们就可以解决错误。

也许还值得注意的是,由于{curring},(tailer x) ytailer x y是等效的。因此,您的意思是sub (tailer x y)sub (tailer x) y。无论哪种情况,都有太多的括号。