Ocaml 这不是一个函数;它无法应用
我是OCaml的新手,我尝试创建一个函数来查看列表x是否是y的子集,我不确定我会错在哪里。我读过很多类似的问题,它们都把类型冲突列为原因,但我不确定哪里有冲突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
# 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
。我可以看出后者在理论上更有意义,但你认为在其他方面差异是否显著?