当提供 kv
时(什么),为什么 is_empty kv
被认为是 ('a,'b) trie -> bool
类型我认为应该是类型 ('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
最佳答案
function
关键字使参数之一隐式,因此 is_empty
之后的 t
参数是多余的,并且是问题的根源。
感谢 #ocaml
上的 struk|desk
提醒我有关语法的信息。
is_empty
的正确定义是
let rec is_empty t = function
|Trie (None, []) -> true
|Trie (Some x, _) -> false
|Trie (None, (k,kv)::tail) -> is_empty kv
关于types - 为什么这个表达式是一个函数而不是一个 bool 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35400546/