为什么这个表达式是函数而不是bool?

时间:2016-02-15 02:18:30

标签: types ocaml

为什么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

1 个答案:

答案 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