具有箭头的OCaml函数类型 - >

时间:2015-10-13 04:49:32

标签: types ocaml

我使用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 `;'.   

首先,有人可以解释函数类型的格式。这些箭是什么意思?如果有人也能找到错误,那也很好。

2 个答案:

答案 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的结果。吨。