2017-08-12 10 views
3

コンストラクターアリティとは独立したコンストラクターとパターンマッチングする方法はありますか?ときどきパターンマッチでは、コンストラクタだけが気になりますが、それに関連付けられたデータは気にしません。Ocamlパターンは、そのアーティーとは独立してデータコンストラクターと一致します

私は、ADTのコンストラクタのアリティを変更すると、すべての「フィールド」を破棄するパターンマッチ(すべてのパターンマッチを変更する必要があります)を実行する必要があります。データコンストラクタ

私は複数のコンストラクタ

(* time * message *) 
type log_message = 
    Warning of float * string 
    | Error of float * string 

とADTを持っていると私は、このタイプの値を検査し、だけ私は場合

let is_error_message x = match x with 
    | Warning _, _ -> false 
    | Error _, _ -> true 

のようなものを記述する必要がコンストラクタを気にするとします後で戻って警告に重大度フィールドを追加して、私に与えたい

is_error_messageのパターンに新しいワイルドカードを追加して、タイプチェッカーを満たす必要があります。

let is_error_message x = match x with 
    | Warning _, _, _ -> false 
    | Error _, _ -> true 

答えて

4

型定義

type log_message = 
    | Warning of float * string 
    | Error of float * string 

両方のコンストラクタ(WarningError)は、2つの引数を受け入れるのではなく、それらの積(すなわちタプル)しないことを意味します。次のようにだから、instatiate:あなたがコンストラクタに渡されたパラメータを気にしない場合

Warning (4.0, "you better be warned") 

この変形のインスタンス上でパターンマッチングを行う、あなただけ(任意の長さのタプルを指定する_を使用することができます):

type log_message = 
    | Warning of float * string 
    | Error of float * string;; 

let is_error_message x = match x with 
    | Warning _ -> false 
    | Error _ -> true;; 

is_error_message (Warning (2.0, "totally not an error"));; 
- : bool = false 
+0

私は '私はちょうど構文を台無しにタプルを取る代わりに、単項のコンストラクタのマルチパラメータコンストラクタの(フロート*文字列)'&C ...の警告を言うためのものだと思います... (そして 'Warning _ _'がなぜ有効でなかったのか分からなかった)。あなたが言っていることはまったく正しいので、私はただ静かに質問を修正したくありません。 –

+1

これは正しくありません。通常のコンストラクタの引数はタプルではありません。 '_'が複数の引数にマッチする理由は、このユースケースをカバーする機能として追加されているからです。 – gsg

+0

@gsgどのバージョンが追加されましたか? –

関連する問題