我使用OCaml StringMap.add函数如下:
let rec makecount l = function
[] -> mymap
| s::tl ->
if (not (StringMap.mem s mymap)) then
StringMap.add s 1 makecount(tl)
else
StringMap.add s ((StringMap.find s mymap) + 1) makecount(tl)
我得到错误,指的是StringMap.add s 1 makecount(List.tl l):
Error: This function has type StringMap.key -> 'a -> 'a StringMap.t -> 'a StringMap.t
It is applied to too many arguments; maybe you forgot a `;'.
首先,有人可以解释函数类型的格式。这些箭是什么意思?如果有人也能找到错误,那也很好。
答案 0 :(得分:1)
function
[] -> ...
| s::tl -> ...
是一个匿名函数,它将其参数与[]
和s::tl
进行匹配,并执行"适合"的第一个分支。 []
只会匹配一个空列表; s::tl
匹配任何包含至少一个元素(s
)的列表,其中tl
是尾部 - 当您砍掉头部时获得的列表。
您为makecount l
分配此参数的匿名函数;意味着makecount
本身现在需要两个参数(你永远不再使用l
)。解决方案很简单:只需删除l
,并使makecount
成为一个带有一个参数的函数(每个上面)。
答案 1 :(得分:1)
如果你写的话:StringMap.add s 1(makecount(List.tl l))? 会发生什么是makecount被认为是代码中的参数,而你想要makecount(List.tl l)的结果。
箭头表示String.Map需要3个参数(分别为StringMap.key,' a,'一个StringMap.t),并返回一个类型'一个StringMap的结果。吨。