【问题标题】:Variants and lists in OcamlOcaml 中的变体和列表
【发布时间】:2017-03-05 15:19:52
【问题描述】:

是否可以使用同时包含整数和函数的变体(或其他东西)来定义列表?我对在列表中混合函数和其他类型特别感兴趣。

类似地,是否可以创建一个可以返回数字或函数的函数? 如果可能,请给出这两种情况的代码示例。

【问题讨论】:

    标签: list function ocaml strong-typing variants


    【解决方案1】:
    type my_elt = 
      | Null
      | Int of int
      | Fun1 of (int-> unit)
      | Fun2 of (int-> int)
    
    let eval a =function
      | Fun1 f -> f a;Null
      | Fun2 f -> Int (f a)
      |  _     -> Null
    
    let leval a l = List.map (fun elt -> eval a elt ) l  
    ;;
    

    测试:

    let l=[Int 2;Fun1 (Printf.printf "%d");Fun2 ((+)2) ]
    # leval 2 l;;
    2- : my_elt list = [Null; Null; Int 4]
    

    【讨论】:

    • 稍微解释一下正在发生的事情肯定会让您的回答更有帮助。
    【解决方案2】:

    当然,在 OCaml 中两者都是可能的。

    如果您想让表达式能够计算出两个(或更多不同类型)的值,那么这意味着您想要创建一个包含所有这些类型的新类型。回想一下,可以将类型与集合进行比较。所以,如果你想定义一个新类型t,它可以包含t1t2类型的值,那么你需要有一个联合。由于类型t1t2 具有不同的属性,很自然,我们希望以后能够区分它们,因此我们希望使联合可区分。碰巧的是,OCaml 具有对可区分联合的内置支持 - 变体,例如

    type t = T1 of t1 | T2 of t2
    

    此类型定义创建一个新类型,即类型t1t2 的可区分联合。该定义自然地创建了投影和注入函数。要将t1 类型的值x 注入t 类型,请使用T1 x(对应于t2 类型的值x,请使用T2 x)。使用模式匹配将值 y 从类型 t 投影到 t1t2,例如 match y with T1 -> ... | T2 -> ...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-14
      • 1970-01-01
      • 2014-03-11
      • 2018-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多