Ocaml 如何获取用户定义类型数据的实际值?

Ocaml 如何获取用户定义类型数据的实际值?,ocaml,Ocaml,如果我定义: type value = | Value of int | Error of string;; 如果我想使用某个值的实际int值作为计算的一部分,比如: let v1 = Value 3;; let v2 = Value 4;; 如果我写: let sum = v1 + v2;; 然后我会收到一条错误消息 错误:此表达式具有类型值,但表达式的类型应为│ int 所以如果我想计算v1和v2的和。如何操作?您的值类型与int不同,前者有值和错误标记。您需要编写处理

如果我定义:

type value =
    | Value of int
    | Error of string;;
如果我想使用某个值的实际int值作为计算的一部分,比如:

let v1 = Value 3;;
let v2 = Value 4;;
如果我写:

let sum = v1 + v2;;
然后我会收到一条错误消息

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


所以如果我想计算
v1
v2
的和。如何操作?

您的
类型与
int
不同,前者有
错误
标记。您需要编写处理这两种情况的代码,例如:

# 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
或者更好:

# 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
#求和x1 x2=
#将(x1,x2)与
#|(一些i1,一些i2)->一些(i1+i2)
#|->无;;
val sum:int option->int option->int option=
#和v1 v2;;
-:int选项=大约7
作为一个高级主题,您还可以在谷歌上搜索“optionmonad”(也称为“maybe monad”)以获得更简单的表示法

您也可以使用异常而不是
选项
,作为功能性较差的替代方案

# 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