如何获得用户定义类型数据的真实价值?

时间:2016-10-15 21:54:34

标签: ocaml

如果我定义:

type value =
    | Value of int
    | Error of string;;

如果我想使用某些Value的实际int值作为计算的一部分,例如:

let v1 = Value 3;;
let v2 = Value 4;;

如果我写:

let sum = v1 + v2;;

然后我会收到一条错误消息

  

错误:此表达式具有类型值,但表达式的类型为│            int

因此,如果我想计算v1v2的总和。怎么做?

1 个答案:

答案 0 :(得分:2)

您的value类型与int的不同之处在于前者具有ValueError标记。您需要编写处理这两种情况的代码,例如:

# match v1 with Error e1 -> Error e1 | Value i1 ->
#   (match v2 with Error e2 -> Error e2 | Value i2 ->
#      Value (i1 + i2)) ;;
- : value = Value 7

或者你可以写一个函数:

# let sum x1 x2 =
#   (match x1 with Error e1 -> Error e1 | Value i1 ->
#      (match x2 with Error e2 -> Error e2 | Value i2 ->
#         Value (i1 + i2))) ;;
val sum : value -> value -> value = <fun>
# sum v1 v2 ;;
- : value = Value 7

您也可以使用标准'a option类型(包含SomeNone代码,而不是ValueError)用于类似目的(尽管它是内容类型'a的多态/泛型,并且在错误情况下不包含string

# let v1 = Some 3 ;;
val v1 : int option = Some 3
# let v2 = Some 4 ;;
val v2 : int option = Some 4
# let sum x1 x2 =
#   (match x1 with None -> None | Some i1 ->
#      (match x2 with None -> None | Some i2 ->
#         Some (i1 + i2))) ;;
val sum : int option -> int option -> int option = <fun>
# sum v1 v2 ;;
- : int option = Some 7

或更好:

# let sum x1 x2 =
#   match (x1, x2) with
#   | (Some i1, Some i2) -> Some (i1 + i2)
#   | _ -> None ;;
val sum : int option -> int option -> int option = <fun>
# sum v1 v2 ;;
- : int option = Some 7

作为一个高级主题,您也可以谷歌选择“选项monad”(也称为“monad”)以获得更简单的符号。

您也可以使用例外代替option作为功能较少的替代方案。