【问题标题】:OCaml variant types: confusing the compilerOCaml 变体类型:混淆编译器
【发布时间】:2014-06-12 04:54:18
【问题描述】:

我正在尝试理解 OCaml 中的变体(虽然这不是家庭作业,但该作业取自我朋友的作业,因此请不要提供更正的代码)。

我有以下代码,代表一个家谱。这个想法是每个家谱要么是未知的,要么是一个人;该人包含指向其他family_trees的链接。

type family_tree = Unknown | Person of person 
  and person = {name: string; year_of_birth: int; 
                mother: family_tree; father: family_tree}

但是,当我尝试实际使用代码来表示一个家庭时,我得到了错误

Error: This expression has type person but an expression was expected 
of type family_tree

产生错误的代码示例:

let ron: family_tree = {name = "Ron Smith"; year_of_birth = "1953";
                        mother = Unknown; father = Unknown}
let jim: family_tree = {name = "Jim Smith"; year_of_birth = "1983";
                        mother = Unknown; father = ron}

如何防止 OCaml 认为 ron 是 person,而不是 family_tree

【问题讨论】:

    标签: types ocaml


    【解决方案1】:

    因为{name = "Ron Smith"}person,但你需要一个family_tree,它被定义为Person person,你需要同时指定变体名称:

    let ron: family_tree = Person {name = "Ron Smith"; ... }
    

    否则您将无法将family_treePersonperson 区分开来。

    【讨论】:

    • 谢谢,这是有道理的。但是,你需要写 let ron: family_tree = Person {name = "Ron Smith"; ... } 让代码在 OCaml 中编译。
    • 抱歉,打错了,已修复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-02
    相关资源
    最近更新 更多