ocaml变种类型操纵

时间:2012-02-04 19:39:38

标签: ocaml

我有这样的变体类型:

type score = 
    InInteger of int
    | InFloat of float ;;

现在,给定两个分数(InInteger(5)InFloat(5.5)),我想添加,减去它们等。

如何做到这一点?

PS - 我是OCaml的新手。

编辑::

更具体地说:

这是如何运作的?

let n = InInt(2);;
let m = InFloat(3.2);;

let var = InFloat(float n +.  m);;

2 个答案:

答案 0 :(得分:5)

首先,受歧视的联盟需要以大写字母开头的标识符:

type score = 
    InInteger of int
    | InFloat of float

其次,您可以通过匹配所有可能情况的模式并返回适当的值来定义此数据类型的add函数:

let add s1 s2 = 
    match s1, s2 with
    | InInteger i1, InInteger i2 -> InInteger (i1 + i2)
    | InInteger i1, InFloat f2   -> InFloat (float i1 +. f2)
    | InFloat f1, InInteger i2   -> InFloat (f1 +. float i2)
    | InFloat f1, InFloat f2     -> InFloat (f1 +. f2)

答案 1 :(得分:3)

+.仅会添加float,而+只会添加int。这里的所有都是它的!如果你的联盟类型中包含了floatint,那么你必须使用match每个填充的答案来取出它们,然后转换普通数字。