我有以下一些代码,我想返回一个布尔值或一个元组。 (函数isvariable
和dont_care
都返回布尔值,fyi)
let match_element (a, b) =
if a = b then true
else if (dont_care a) || (dont_care b) then true
else if (isvariable a) then (a, b)
else if (isvariable b) then (b, a)
else false;;
目前,它引发了以下错误:
有什么方法可以解决这个问题吗?
This expression has type 'a * 'b
but an expression was expected of type bool
(此函数基于Python程序的说明,我不确定它是否可以在OCaml中使用。)
答案 0 :(得分:11)
你想要的是,粗略地讲,ad-hoc多态或重载。在OCaml中是不可能的,更重要的是,我们不希望在OCaml中使用它。
如果你想拥有一个返回多个类型的函数,那么你必须定义一个新的“sum”类型,它可以表达这些类型:在这里,你想要返回一个布尔值或一个元组,所以一个新类型意味着“布尔或元组”。在OCaml中,我们定义了如下类型:
type ('a, 'b) t = Bool of bool
| Tuple of 'a * 'b
使用这个新的sum类型,您的代码应如下所示:
type ('a, 'b) t =
| Bool of bool
| Tuple of 'a * 'b
let match_element (a, b) =
if a = b then Bool true
else if dont_care a || dont_care b then Bool true
else if is_variable a then Tuple (a, b)
else if is_variable b then Tuple (b, a)
else Bool false;;
这里带有两个参数('a和'b)的类型t对于你的目的来说可能过于笼统,但我无法猜测你想从上下文中做什么。可能有更符合您意图的更好的类型定义,例如:
type element = ... (* Not clear what it is from the context *)
type t =
| I_do_not_care (* Bool true in the above definition *)
| I_do_care_something (* Bool false in the above definition *)
| Variable_and_something of element * element (* was Tuple *)