我试图创建一个使用已定义类型的子类型的函数,但OCaml不会得到正确的值: 考虑这种类型定义:
type fraction = {numerator : int; denominator : int};;
type number =
| Int of int
| Fraction of fraction;;
如果我尝试输入interpeter(如果重要的话我会使用utop):
utop # ((fun a-> a>0) (Int 1));;
Error: This expression has type number but an expression was expected of type int
类型号也是一个int但是我无法理解这个函数,我怎么能解决这个问题呢?
答案 0 :(得分:2)
0
中的a>0
是int
,因此这是函数期望作为参数的类型。你可能想要的是0
是等效的number
,如下所示:
# (fun a -> a > Int 0) (Int 1)
- : bool = true
答案 1 :(得分:2)
您可以在fun
:
# (fun (Int a) -> a > 0) (Int 1);;
Warning 8: this pattern-matching is not exhaustive.
Here is an example of a value that is not matched:
Fraction _
- : bool = true
如果传入Fraction
,显然会引发匹配错误。如果你想处理这种情况:
# (function Int a -> a > 0 | Fraction {numerator = a; denominator = b} -> a/b > 0 ) (Int 1);;
- : bool = true