如果我定义:
type value =
| Value of int
| Error of string;;
如果我想使用某些Value的实际int值作为计算的一部分,例如:
let v1 = Value 3;;
let v2 = Value 4;;
如果我写:
let sum = v1 + v2;;
然后我会收到一条错误消息
错误:此表达式具有类型值,但表达式的类型为│ int
因此,如果我想计算v1
和v2
的总和。怎么做?
答案 0 :(得分:2)
您的value
类型与int
的不同之处在于前者具有Value
和Error
标记。您需要编写处理这两种情况的代码,例如:
# 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
类型(包含Some
和None
代码,而不是Value
和Error
)用于类似目的(尽管它是内容类型'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
作为功能较少的替代方案。