vacios son sintaxis sensible reglas que minusculas mayusculas los lista etiquetas estructura elementos cuales componentes basicas f# unit-type

son - F#cómo escribir una declaración vacía



xml es sensible a mayusculas y minusculas (2)

¿Cómo puedo escribir una declaración de no-op en F #?

Específicamente, ¿cómo puedo mejorar la segunda cláusula de la siguiente declaración de coincidencia:

match list with | [] -> printfn "Empty!" | _ -> ignore 0


La respuesta de Stringer es, por supuesto, correcta. Pensé que podría ser útil aclarar cómo funciona esto, porque "()" no es realmente una declaración vacía o un efecto secundario vacío ...

En F #, cada pieza de código válida es una expresión . Las construcciones como let y match consisten en algunas palabras clave, patrones y varias subexpresiones. La gramática F # para let y match ve así:

<expr> ::= let <pattern> = <expr> <expr> ::= match <expr> with | <pat> -> <expr>

Esto significa que el cuerpo de let o el cuerpo de cláusula de match debe ser una expresión. Puede ser alguna llamada de función como ignore 0 o puede ser algún valor; en su caso, debe ser una expresión del tipo de unit , porque printfn ".." también es de tipo unit .

El tipo de unit es un tipo que tiene un solo valor, que se escribe como () (y también significa tupla vacía sin elementos). Esto es, de hecho, algo similar a void en C # con la excepción de que void no tiene ningún valor.

Por cierto: el siguiente código puede parecer una secuencia de sentencias, pero también es una expresión:

printf "Hello " printf "world"

El compilador de F # agrega implícitamente ; entre las dos lineas y ; es un operador de secuenciación, que tiene la siguiente estructura: <expr>; <expr> <expr>; <expr> . Requiere que la primera expresión devuelva unit y devuelva el resultado de la segunda expresión.

Esto es un poco sorprendente cuando viene con un fondo de C #, pero hace que el lenguaje sea sorprendentemente elegante y elegante. No te limita de ninguna manera; por ejemplo, puedes escribir:

if (a < 10 && (printfn "demo"; true)) then // ...

(Este ejemplo no es realmente útil, solo una demostración de la flexibilidad)


Utilice la unidad para el efecto secundario vacío:

match list with | [] -> printfn "Empty!" | _ -> ()