我是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的当前头。递归最终将导致对或错,所以我看不到类型冲突可能发生的地方。
答案 0 :(得分:0)
在
sub((tailer x) y)
外部括号表示您正在将y
应用于tailer x
的结果。错误消息告诉您该结果是'a list
,而不是函数。这也意味着您只将一个参数传递给'sub',这是将y
应用于tailer x
的结果。
我不确定您为什么相信这些括号是必要的,但是您似乎将其与C样式函数应用程序混淆了,只需删除它们就可以解决错误。
也许还值得注意的是,由于{curring},(tailer x) y
和tailer x y
是等效的。因此,您的意思是sub (tailer x y)
或sub (tailer x) y
。无论哪种情况,都有太多的括号。