【发布时间】:2019-10-09 18:16:32
【问题描述】:
我是 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 x y 中,我可以为空列表 x 返回“true”,在 x 的 List.tl 上重做 sub,也就是没有头部的列表(据我了解),或者如果返回 false我无法在 y 中找到 x 的当前头部。递归最终必须导致真或假,所以我看不出哪里会出现类型冲突。
【问题讨论】:
-
为了获得最佳效果,我建议您仅通过模式匹配访问列表元素。您甚至可能不需要使用
List模块中的函数。例如,您可以使用match ... with [] -> ... | head :: tail -> ...来检查列表是否为空,而无需计算其长度。
标签: ocaml