我是使用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 但是期望表达式类型为
列表
在查找功能。 有什么问题,我该如何解决?
答案 0 :(得分:0)
match
中lookup
表达式的所有分支都应具有相同的类型 - 这对应于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