2016-04-07 14 views
-1

アクティブパターンのユニオンケースには常にワイルドカードが必要ですか?アクティブパターンのユニオンケースには常にワイルドカードが必要ですか?

警告:

不完全なパターンは、この式に一致します。

let (|Positive|Neutral|Negative|) = function 
    | x when x > 0 -> Positive 
    | x when x = 0 -> Neutral 
    | x when x < 0 -> Negative 

私は組合のケースとしてワイルドカードを挿入すると警告が解決されます。私は他の

let (|Positive|Neutral|Negative|) = function 
    | x when x > 0 -> Positive 
    | x when x = 0 -> Neutral 
    | x when x < 0 -> Negative 
    | _   -> failwith "unknown" 

何例をしないのですか?

+0

F#仕様のセクション7.2.3アクティブパターン –

+0

お読みください。私はそれを見直した。しかし、私が受け取っていた警告に関する情報は見ませんでした。 –

+1

[F#の重複した可能性があります。 "when"を使用すると、この式で不完全なパターンが一致します..Why?](http://stackoverflow.com/questions/18691622/f-incomplete-pattern-matches-on-this-expression-whenなぜなら、なぜ?) – Ringil

答えて

4

when(一般的に)ガードはコンパイラによってチェックできません。あなたはケースを欠落していないとして、この特定のケースでは、しかし、ちょうど最後のガードを除外:

let (|Positive|Neutral|Negative|) = function 
    | x when x > 0 -> Positive 
    | x when x < 0 -> Negative 
    | _ -> Neutral 

注:intため、これはOKで、float sがいくつかのケース(NaNと無限大)より必要コンパイラはそこであなたを助けません(あなたが今発見したように)。

関連する問題