web-dev-qa-db-ja.com

F#には三項?:演算子がありますか?

私はC#からF#を学んでいて、次のような式をコンパイルしようとしました

let y = Seq.groupBy (fun x -> (x < p ? -1 : x == p ? 0: 1))

ただし、「式の予期しない整数リテラル」を参照してください。 F#には三項演算子がありますか?そうでない場合は、代わりに何を使用すればよいですか?

35

はい、それはif .. then .. else

実際、F#では、if .. then .. elseブロック。

C#var x = true ? 0 : 1;

F#let x = if true then 0 else 1

だからあなたの場合:

let y = Seq.groupBy (fun x -> if x < p then -1 else if x = p then 0 else 1)

Elifで少し短くできます

let y = Seq.groupBy (fun x -> if x < p then -1 Elif x = p then 0 else 1)

3つ以上のケースがある場合にF#で特に考慮すべき別のオプションは、パターンマッチングです。

let f p x =
    match x with
    | x when x < p -> -1
    | x when x = p ->  0
    | _ -> 1

let y = Seq.groupBy (f p)

しかし、特定のケースでは、if .. then .. Elif .. thenを使用します。

最後に、test-equality演算子は=ない== C#と同様。

54
Gus

ガードを使用した関数とのパターンマッチングを使用してこれを実装することもできます。

    let y = Seq.groupBy  (function |x when x < p -> -1
                                   |x when x = p -> 0
                                   |_ -> 1)

パターンマッチは3項演算子が長く見えるかもしれませんが、ロジックが複雑になるほど読みやすくなります。

6
Turkka Mannila

タイピングを保存したい場合は、独自に定義できます

let (?=) (q: bool) (yes: 'a, no: 'a) = if q then yes else no

演算子では:を使用できないので、?=が最も近い値になることに注意してください。

使用法:多分?=( "true"、 "false")

5
Chris Woodward

F#でのC#式とステートメントのその他の例については、 this ページを参照してください。例えば:

三項演算子

C#には、条件式用の三項演算子「?:」があります。

condition ? trueVal : falseVal 

F#にも同じ演算子がありますが、その名前はif-then-elseです。

if condition then trueVal else falseVal

(「if」はC#よりもF#で使用される頻度がはるかに少ないことに注意してください。F#では、if-then-elseではなくパターンマッチングを介して多くの条件式が実行されます。)

Switchステートメント

C#にはswitchステートメントがあります。次のようになります。

switch (x) 
{ 
    case 1: 
        SomeCode(); 
        break; 
    default: 
        SomeCode(); 
        break; 
} 

F#では、これはパターンマッチングがより簡潔に表現する多くのことの1つにすぎません。

    match x with 
     | 1 -> SomeCode() 
     | _ -> SomeCode()  // _ is a ‘catch all’ default
4
MeanGreen