2016-04-07 8 views
0

ワイルドカード値を特定するために明示的な一致ステートメントを使用する必要がありますか?明示的な一致ステートメントを使用してワイルドカード値を識別する必要がありますか?

はたとえば、次の関数を取る:

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

エラー:

Unexpected symbol '_' in expression

私はエラーなしでこれを行うことができますことを学んだ

let (|Positive|Neutral|Negative|) v = 
    match v with 
    | x when x > 0 -> Positive 
    | x when x = 0 -> Neutral 
    | x when x < 0 -> Negative 
    | _   -> failwith (sprintf "unknown: %d" v) 

更新

は、ここに掲載の答えからの結果だ:

let (|Positive|Neutral|Negative|) = function 
    | x when x > 0 -> Positive 
    | x when x = 0 -> Neutral 
    | x when x < 0 -> Negative 
    | x   -> failwith (sprintf "unknown: %d" x) 
+1

と思います。それは決して値を割り当てられない特別なシンボルです(別の.NET言語を除いて) – TheQuickBrownFox

+0

これはC#の変数、メソッドなどのための完全に有効な識別子です。この特別な意味はF#固有のものです。 (VB.NETは、この種のパターンマッチングをしていないにもかかわらず、識別子として使うことはできません。) – TeaDrivenDev

答えて

2

あなたはこれにそれを変更することができ、それが動作します:/破棄を無視するようにアンダースコアの

let (|Positive|Neutral|Negative|) = function 
    | x when x > 0 -> Positive 
    | x when x = 0 -> Neutral 
    | x when x < 0 -> Negative 
    | f   -> failwith (sprintf "unknown: %d" f) 
+0

ありがとう。私はワイルドカードを完全に削除してfを使うことができることを学んだ –

+0

ええと、私はそれを忘れてしまった – kemiller2002