2016-06-22 4 views
17

今日、F#パターンマッチ構文で奇妙なことが起こりました。これは、排他性チェックの明らかな失敗につながります。パターンマッチング構文のあいまいさ

上記のシナリオでは、コンパイラは、2番目のルールが決してマッチしないと私に伝えます。しかし、コードを少しコンパクトにして書いてみたら、

let useThing = 
    function 
    | This | That -> "A" 
    | That | Other -> "B"  

私はコンパイラの助けを借りていません。私はだと思うのは、は、| This -> "A" | That -> "A"のショートカットではないが、それは非常によく似ている(と私はそれを扱うような多くのコードサンプルを見てきた)。代わりに、私が見つけることができるから、パイプシンボルは、個々のパターンを分離するために、またORパターンとしても使用されます。

これはほとんどのDUにとって大きな問題ではありませんが、大量のケースを含むDUを少数のケースで別のDUにマッピングするときに問題が発生しました。ショートカット構文を使用しようとしたところ、バグが発生しました。

だから私の質問は以下のとおりです。

  1. 正しい私の解釈ですか?
  2. 各パターンを別々の行に記載する以外に回避策はありますか?

答えて

8

あなたの解釈は正しいです。

私にPattern Matching (F#)

で説明したようにORパターンを作成している第一および第二ThisThatのためのアクションを除外することで、これは、少し混乱しても、論理的以来「または」である|| F#で。 そして、それはあなたの書式設定にorようnew alternativeとして、第1バーと第二の棒を簡単に確認することができながら、コンパイラは全体のパターンは無用であるかどうかを伝えることができますが、それはパターンを簡略化することができませんしかし、それは

let useThing = 
    function 
    | This 
    | That -> "A" 
    | That 
    | Other -> "B" 

にそれほど明確になり。 That | Otherは有効な一致を持っているため、コンパイラによって考慮されるように冗長ではありません。
部品が残っているかどうか、または部品を簡素化する方法が明らかでない場合は、より複雑なパターンを考えることができます。

関連する問題