ocaml构建模块(超级初学者)

时间:2017-03-05 08:57:55

标签: module ocaml

我是使用ocaml进行模块编程的新手。我制作了一个字典模块,如

module type DICT =
  sig
    type key
    type 'a dict
    ...
    val lookup : 'a dict -> key -> 'a option
    ...
  end


module DictList : DICT with type key = string =
  struct
    type key = string
    type 'a dict = (key * 'a) list

    ...
    **let rec lookup d k =
        match d with
        | [] as dict -> None
        | (key, value)::tl as dict -> if( key = k ) then (key, value)
                                      else lookup tl k**
    ...
  end

lookup d k搜索字典d中的密钥k。如果找到密钥,则返回该项,否则返回None。但是,我收到了一个错误

  

错误:此表达式的类型为' a *' b          但是期望表达式类型为列表

在查找功能。 有什么问题,我该如何解决?

2 个答案:

答案 0 :(得分:0)

matchlookup表达式的所有分支都应具有相同的类型 - 这对应于lookup的返回类型:'a option。因此,“找到”案例应该返回Some value而不是(key, value)

答案 1 :(得分:0)

你在这里遇到两个问题(并且没有一个问题给你声称你得到的错误)。

第一个问题:您的lookup函数没有一致的类型

一个分支返回None,因此类型应为'a option。 另一个分支返回(key, value),因此类型应为'a * 'b

如何解决?将(key, value)更改为Some (key, value)

不幸的是,还有

第二个问题:您的lookup函数与模块类型中的定义不对应。

如果你看一下DICT的定义,你会发现lookup'a dict -> key -> 'a option

现在,在您对DictList模块key的定义为string时,lookup应为'a dict -> string -> 'a option,其中a为类型您存储在字典中的值。这意味着您无法返回Some (key, value),因为lookup将签名'a dict -> string -> (string * 'a) option。仅返回Some value

所以,你的定义应该是

module DictList : DICT with type key = string =
    struct
    type key = string
    type 'a dict = (key * 'a) list
    let rec lookup d k =
        match d with
        | [] -> None
        | (key, value)::tl -> if (key = k) then Some value else lookup tl k
    end