Ocaml:在参数类型中使用记录和变体

时间:2018-05-06 06:53:58

标签: ocaml record variant bucklescript

作为Ocaml的新手,我正在玩类型并尝试了解变体是如何工作的。

以下是样本:

type 'a component =
  { foo : int;
    bar : 'a }

type string_or_float_component =
  | Str of string component
  | Flt of float component

let get_foo_1 (comp: 'a component) = comp.foo
(* works *)

let get_foo_2 (Str comp) = comp.foo
(* works *)

let get_bar_3 (comp : string_or_float_component) = comp.foo
(* This expression has type string_or_float_component
   but an expression was expected of type 'a component *)

我没有尝试找到最佳解决方案(如模式匹配),只是理解为什么ocaml可以在get_bar_3中推断该组件是Str | FLT。

也许这种伎俩有可能吗?

type 'a string_or_float =
  | Str of string 'a
  | Flt of float 'a

由于

(我使用bucklescript)

修改:

意识到我的问题与设计有关。我可以使用这样的东西:

type string_or_float  =
    | Str of string
    | Flt of float


type 'a component = { foo: int; bar: 'a }

let get_bar_3 (comp : string_or_float component) ...

1 个答案:

答案 0 :(得分:3)

在表达式let get_bar_3 (comp : string_or_float_component)中,comp是枚举类型:Str of somethingFlo of something。 在任何情况下,comp此时都不是记录类型,只有something是记录类型。

something

中提取字段
 let get_bar_3 (comp : string_or_float_component) = let Str a = comp in a.foo;;

这将在编译类型时发出警告。 完整的代码就是这个:

 let get_bar_3 (comp : string_or_float_component) = match comp with
  | Str a -> a.foo
  | Flt a -> a.foo;;