una ternario operador linea hacer formas ejemplo condicional f# conditional-operator

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.