Does F# have the ternary ?: operator?

后端 未结 4 1592
孤独总比滥情好
孤独总比滥情好 2021-01-07 16:04

I\'m learning F# coming from C# and I\'ve just tried compiling an expression like

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


        
4条回答
  •  迷失自我
    2021-01-07 17:00

    Yes, it's called if .. then .. else

    In fact in F# everything is an expression, even an if .. then .. else block.

    In C# var x = true ? 0 : 1;

    In F# let x = if true then 0 else 1

    So in your case:

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

    you can shorten it a bit with elif

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

    Another option to consider in F# specially when you have more than 2 cases is pattern matching:

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

    But in your particular case I would use the if .. then .. elif .. then.

    Finally note that the test-equality operator is = not == as in C#.

提交回复
热议问题