为什么is_empty kv
被认为是类型('a,'b) trie -> bool
,当提供kv
时(我认为应该是类型('k, 'v) -- a Trie)
?)毕竟,该函数被定义为递归,其他返回值的类型为bool
。
正如这里所写,代码片段不应该是正确的,但只是作为我对类型系统的混淆的一个例子。
在单独的签名文件中:
type ('k, 'v) trie
val empty : ('k, 'v) trie
val is_empty : ('k, 'v) trie -> bool
在实施文件中:
type ('k, 'v) trie = Trie of 'v option * (('k * ('k, 'v) trie) list)
let empty = Trie (None, [])
let rec is_empty t = function
|Trie (None, []) -> true
|Trie (Some x, _) -> false
|Trie (None, (k,kv)::tail) -> is_empty kv
错误:
File "trie.ml", line 11, characters 34-45:
Error: This expression has type ('a, 'b) trie -> bool
but an expression was expected of type bool
答案 0 :(得分:2)
function
关键字使其中一个参数隐式,因此t
之后的is_empty
参数是多余的,并且是问题的根源。
感谢struk|desk
上的#ocaml
提醒我语法。
is_empty
的正确定义是
let rec is_empty t = function
|Trie (None, []) -> true
|Trie (Some x, _) -> false
|Trie (None, (k,kv)::tail) -> is_empty kv