f# - linea - operador ternario python
¿Tiene F#el operador ternario ?: (4)
Estoy aprendiendo F # proveniente de C # y acabo de intentar compilar una expresión como
let y = Seq.groupBy (fun x -> (x < p ? -1 : x == p ? 0: 1))
pero vea ''literal entero inesperado en la expresión''. ¿F # tiene un operador ternario? Si no, ¿qué debo usar en su lugar?
Para más ejemplos de expresiones y declaraciones en C # en F #, puede consultar this página. Por ejemplo:
Operador ternario
C # tiene el operador ternario "?:" Para expresiones condicionales:
condition ? trueVal : falseVal
F # tiene el mismo operador, pero su nombre es if-then-else:
if condition then trueVal else falseVal
(Tenga en cuenta que "if" se usa con mucha menos frecuencia en F # que en C #; en F #, muchas expresiones condicionales se realizan mediante la coincidencia de patrones en lugar de if-then-else).
Cambiar la declaración
C # tiene una instrucción switch. Se ve algo como esto:
switch (x) { case 1: SomeCode(); break; default: SomeCode(); break; }
En F #, esta es solo una de las muchas cosas en que la coincidencia de patrones se expresa de manera más sucinta:
match x with | 1 -> SomeCode() | _ -> SomeCode() // _ is a ‘catch all’ default
Sí, se llama if .. then .. else
De hecho, en F # todo es una expresión, incluso un bloque if .. then .. else
.
En C # var x = true ? 0 : 1;
var x = true ? 0 : 1;
En F # let x = if true then 0 else 1
Así que en tu caso:
let y = Seq.groupBy (fun x -> if x < p then -1 else if x = p then 0 else 1)
puedes acortarlo un poco con elif
let y = Seq.groupBy (fun x -> if x < p then -1 elif x = p then 0 else 1)
Otra opción a considerar en F # especialmente cuando tiene más de 2 casos es la coincidencia de patrones:
let f p x =
match x with
| x when x < p -> -1
| x when x = p -> 0
| _ -> 1
let y = Seq.groupBy (f p)
Pero en tu caso particular usaría el if ... then .. elif .. then.
Finalmente, tenga en cuenta que el operador de prueba de igualdad es =
no ==
como en C #.
Si desea guardar la escritura puede definir su propia
let (?=) (q: bool) (yes: ''a, no: ''a) = if q then yes else no
Tenga en cuenta que no puede usar: en operadores, entonces? = Es lo más cerca que puede estar.
Uso: ¿quizás? = ("Verdadero", "falso")
También puede implementar esto usando la coincidencia de patrones con la función usando guardas:
let y = Seq.groupBy (function |x when x < p -> -1
|x when x = p -> 0
|_ -> 1)
Las coincidencias de patrones pueden parecer operadores ternarios más largos, pero son mucho más fáciles de leer cuando la lógica se vuelve más compleja.