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))
but see 'unexpected integer literal in expression'. Does F# have a ternary operator? If not, what should I use instead?
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#.