2016-10-30 3 views
2

OCamlにいくつかのコードを入力していたので、私は一度に2つのケースをマッチさせたいと思いました。(私が書いている関数は可換ですから)"変数は...このパターンの両側に現れなければなりません"

type something = 
    | Two of int * int 
    | One of int 

let my_function p q = 
    match p, q with 
    | Two (_, _) as two, One (x) 
    | One (x), Two (_, _) as two -> (* some value *) 
    | _ -> (* some other value *) 
;; 

私は次のエラーを取得しています:

Error: Variable two must occur on both sides of this | pattern 

私はasステートメントを削除し、私はロジックの目的のためにそれを必要とするときに問題が発生しません。なぜ私はこれのようにすることができないのですか?ロジックを2回書き直すことに頼らなければならないのですか?

+0

解決策が見つかりました。マッチステートメントの2番目の '|'は、 'something * something'型の単一の値として' One(x)、Two(_、_) 'をマシーンしていました。括弧を追加すると、問題が修正されます: 'One(x)、(Two(_、_)as two)' – shooqie

答えて

3

asは、,より低い優先度を持ちます。したがって、かっこはTwo (_,_) as twoのまわりに入れてください。

+0

あなたはすでにそれを持っています。とにかくありがとう! – shooqie

関連する問題