¿Qué consejos generales tienes para jugar al golf en F #? Estoy buscando ideas que puedan aplicarse a los problemas de golf de código en general que sean al menos algo específicos para F # (por ejemplo, "eliminar comentarios" no es una respuesta). Por favor, publique un consejo por respuesta.
21
Deconstrucción de tuplas
En caso de que no pueda usar variables, use la deconstrucción de tuplas en lugar de múltiples expresiones let
en lugar de
Lectura de stdin
La biblioteca central de F # define un alias para
System.Console.In
llamadostdin
. Estos le permiten leer la entrada.TextReader en msdn
La gran ventaja, aparte del hecho de que es más corto de lo que
Console
es, tampoco tiene que abrir el SistemaIterando sobre la cuerda
La cadena es básicamente una
char seq
, esto le permite usarSeq.map
directamente con cadenas. También es posible usarlos en comprensiones[for c in "" do]
Mutables / Celdas de referencia
El uso de celdas de referencia no siempre es más corto, ya que cada operación de lectura viene con un carácter adicional para desarmar la celda.
Consejos generales
Es posible escribir la
match .. with
línea completaNo hay necesidad de espacios en blanco antes y después de los caracteres no alfanuméricos.
En caso de que necesite rellenar una cadena con espacios a la izquierda o a la derecha, puede usar las banderas [s] printf [n] para eso.
Módulo Core.Printf
fuente
Use id en lugar de x-> x
id es un operador que representa la función de identidad.
puede ser escrito
fuente
Lo uso aqui
fuente
Eta-conversión para funciones
Muchas gracias a Laikoni por este consejo en una de mis soluciones .
Considere una función para, por ejemplo, sumar una cadena con 3 para letras mayúsculas y 1 para todos los demás caracteres. Entonces:
Mediante eta-conversion, esto puede reescribirse como:
y llamado de la misma manera que antes:
La función operador de composición directa
>>
Ahora suponga que nuestro desafío original sería sumar una cadena con 3 para letras mayúsculas y 1 para letras minúsculas, y todos los demás caracteres están excluidos.
Podríamos escribir esto como:
Podemos usar el operador de composición directa (
>>
) para encadenar las dos funciones (Seq.filter
ySeq.sumBy
) juntas. Con eta-conversion la definición de la función sería:Chris Smith hizo una gran reseña sobre el
>>
operador en su blog de MSDN .fuente
Cuando sea posible
Seq
es más corto queList
:es un char más corto ...
fuente
Evite los paréntesis cuando use un parámetro y en tupla
puede ser escrito
fuente
Prefiere una nueva cadena de línea sobre "\ n"
Esto comenzará a pagar incluso con un solo carácter de línea nueva en su código. Un caso de uso podría ser:
(18 bytes)
(17 bytes)
Inspirado en la respuesta de Chiru para es6 .
Utilizado aquí
fuente
Use .NET
.NET ofrece muchas buenas construcciones. F # puede usarlos, ¡así que no los olvides!
Ejemplo:
¡Puede ser útil!
fuente
Use lambdas para guardar un byte. Por ejemplo, esto:
Se puede expresar así:
fuente
Use para ... en lugar de para ... para caminar un rango
fuente
La
module
palabra clave se puede usar para acortar los nombres de los módulos cuando se usan repetidamente. Por ejemplo:puede llegar a ser
Esto es más útil para programas más largos donde los métodos de módulo se usan repetidamente (y deben nombrarse completamente cada vez porque tienen el
RequireQualifiedAccess
modificador), y permite eliminar algunos caracteres, especialmente cuando es más útil usar una matriz CLR normal (por ejemplo, mutabilidad ) que un F #seq
olist
.fuente