types - 为什么这个表达式是一个函数而不是一个 bool 值?

标签 types ocaml

当提供 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/

相关文章:

ocaml - 比较 float 列表

types - 如何在 OCaml 中定义相互引用的两种类型?

java - 如何防止 Element<Integer> 变成 Element<Object>

haskell - 如何在 Haskell 中编写函数 'twice'?

C#:将字符串转换为对象引用

ocaml - 如何在顶层之外打印 OCaml 值?

module - 打开 Module_name 给出编译器错误

c++ - 使用 opam 安装适用于 Z3 的 ocaml API

c - Objective-C : BOOL vs bool

python - 联合类型实际上存在于 python 中吗?