OCaml 中的“and”关键字是啥意思?

Posted

技术标签:

【中文标题】OCaml 中的“and”关键字是啥意思?【英文标题】:What does the `and` keyword mean in OCaml?OCaml 中的“and”关键字是什么意思? 【发布时间】:2016-12-17 11:47:46 【问题描述】:

我对 OCaml 中的 and 关键字感到困惑。翻看this code,我明白了

type env = 
    (* fields for a local environment described here *)


and genv 
    (* fields for a global environment here *)

然后later,

let rec debug stack env (r, ty) = (* a function definition *)

and debugl stack env x = (* another function definition *)

这里发生了什么? and 关键字是否只是复制最后一个 typeletlet rec 语句?是否有 and rec 声明之类的东西?为什么我要使用and 而不是只输入lettype,从而使我的代码在重构时不那么脆弱?还有什么我应该知道的吗?

【问题讨论】:

【参考方案1】:

and 关键字用于避免多个 let(第一个示例,我从不使用它,但为什么不使用它)或用于类型、函数、模块的相互递归定义...

正如您在第二个示例中看到的那样:

let rec debug stack env (r, ty) =
   ...
   | Tunresolved tyl -> o "intersect("; debugl stack env tyl; o ")"
   ...
 
 and debugl stack env x =
   ...
   | [x] -> debug stack env x
   ...

debug 调用debugl,反之亦然。所以and 允许这样做。

[编辑] 没有给出一个合适的例子让我很困扰,所以这里有一个你经常会看到的例子:

 let rec is_even x =
   if x = 0 then true else is_odd (x - 1)
 and is_odd x =
   if x = 0 then false else is_even (x - 1)

(你可以找到这个例子here)

对于相互递归的类型,很难找到配置,但遵循 this wikipedia page 我们将定义 treesforests 如下

 type 'a tree = Empty | Node of 'a * 'a forest
 and 'a forest = Nil | Cons of 'a tree * 'a forest

例如,由空树、标记为a 的单例树和标记为bc 的两节点树组成的森林将表示为:

 let f1 = Cons (Empty, (* Empty tree *)
             Cons (Node ('a',  (* Singleton tree *)
                         Nil), (* End of the first tree *)
                   Cons (Node ('b', (* Tree composed by 'b'... *)
                               Cons (Node ('c', (* and 'c' *)
                                           Nil), 
                                     Nil)
                           ),
                         Nil (* End ot the second tree *)
                     )
               )
         );;
  

大小函数(计算森林中的节点数)将是:

let rec size_tree = function
  | Empty -> 0
  | Node (_, f) -> 1 + size_forest f
and size_forest = function
  | Nil -> 0
  | Cons (t, f) -> size_tree t + size_forest f

我们得到

# size_forest f1;;
- : int = 3

【讨论】:

以上是关于OCaml 中的“and”关键字是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

“let () =”在 Ocaml 中是啥意思?

C++中的restrict关键字是啥意思?

Java中的关键字“transient”是啥意思? [复制]

c#中的_Default关键字是啥意思

打字稿中的模块关键字是啥意思?

python的关键字都有哪些,都是啥意思?