私はC#からF#を学んでいて、次のような式をコンパイルしようとしました
let y = Seq.groupBy (fun x -> (x < p ? -1 : x == p ? 0: 1))
ただし、「式の予期しない整数リテラル」を参照してください。 F#には三項演算子がありますか?そうでない場合は、代わりに何を使用すればよいですか?
はい、それは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#と同様。
ガードを使用した関数とのパターンマッチングを使用してこれを実装することもできます。
let y = Seq.groupBy (function |x when x < p -> -1
|x when x = p -> 0
|_ -> 1)
パターンマッチは3項演算子が長く見えるかもしれませんが、ロジックが複雑になるほど読みやすくなります。
タイピングを保存したい場合は、独自に定義できます
let (?=) (q: bool) (yes: 'a, no: 'a) = if q then yes else no
演算子では:を使用できないので、?=が最も近い値になることに注意してください。
使用法:多分?=( "true"、 "false")
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