2

ブール値またはタプルのいずれかを返したい次のコードがあります。(関数isvariabledont_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で可能かどうかはわかりません。)

4

1 に答える 1

12

あなたが望むのは、非常に大まかに言えば、アドホックなポリモーフィズムまたはオーバーロードです。それは OCaml では不可能であり、さらに重要なことに、OCaml で使用したくありません。

複数の型を返す関数が必要な場合は、これらの型を表現できる新しい「合計」型を定義する必要があります。ここでは、ブール値またはタプルを返したいので、「ブール値」を意味する新しい型またはタプル」。OCaml では、次のような型を定義します。

type ('a, 'b) t = Bool of bool
                | Tuple of 'a * 'b

この新しい合計型を使用すると、コードは次のようになります。

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;;

ここで 2 つのパラメーター ('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 *)
于 2013-02-08T02:41:51.020 に答える