tipos - La función de la función Haskell(.) Y la aplicación de función($) modismos: uso correcto
sintaxis basica de haskell (7)
Creo que puedo responder esto desde la autoridad.
¿Hay alguna razón para usar los libros de una manera mucho mejor que usar todos los símbolos ($)?
No hay una razón especial. Bryan y yo preferimos reducir el ruido de la línea. .
es más silencioso que $
. Como resultado, el libro usa la f . g . h $ x
f . g . h $ x
f . g . h $ x
sintaxis
He estado leyendo Real World Haskell , y estoy llegando al final, pero una cuestión de estilo ha sido difícil para mí con los operadores (.)
Y ($)
.
Cuando escribes una función que es una composición de otras funciones, la escribes así:
f = g . h
Pero cuando aplicas algo al final de esas funciones, lo escribo así:
k = a $ b $ c $ value
Pero el libro lo escribiría así:
k = a . b . c $ value
Ahora, para mí se ven funcionalmente equivalentes, hacen exactamente lo mismo en mis ojos. Sin embargo, cuanto más miro, más veo a las personas escribiendo sus funciones de la manera que lo hace el libro: componer con (.)
Primero y luego solo al final ($)
para agregar un valor para evaluar el lote (nadie lo hace) con muchas composiciones en dólares).
¿Hay alguna razón para usar los libros de una manera mucho mejor que usar todos los símbolos ($)
? ¿O hay alguna mejor práctica aquí que no estoy recibiendo? ¿O es superfluo y no debería preocuparme por eso en absoluto?
En verdad son equivalentes: tenga en cuenta que el operador $
hace, esencialmente, nada. f $ x
evalúa a fx
. El propósito de $
es su comportamiento de fijación: derecho de asociación y precedencia mínima. Quitando $
y usando paréntesis para agrupar en lugar de infijo de precedencia, los fragmentos de código se ven así:
k = a (b (c (value)))
y
k = (a . b . c) value
La razón para preferir el .
la versión sobre la versión $
es la misma razón para preferir ambas sobre la misma versión anterior entre paréntesis: atractivo estético.
Aunque, algunos podrían preguntarse si el uso de operadores de infijo en lugar de paréntesis se basa en algún impulso subconsciente para evitar cualquier parecido posible con Lisp (es broma ... ¿no?).
Es solo una cuestión de estilo. Sin embargo, la forma en que el libro lo hace tiene más sentido para mí. Compone todas las funciones y luego las aplica al valor.
Su método simplemente parece extraño, y los últimos $
son necesarios.
Sin embargo, realmente no importa. En Haskell, generalmente hay muchas, muchas formas correctas de hacer lo mismo.
Hay una discusión interesante de esta pregunta en este hilo de haskell-cafe . Aparentemente hay un punto de vista minoritario que sostiene que la asociatividad correcta de $
es "simplemente incorrecta" , y la elección de f . g . h $ x
f . g . h $ x
f . g . h $ x
sobre f $ g $ h $ x
es una forma de evitar el problema.
Me doy cuenta de que esta es una pregunta muy antigua, pero creo que hay otra razón para esto que no se ha mencionado.
Si está declarando una nueva función sin puntos f . g . h
f . g . h
f . g . h
, el valor que pase se aplicará automáticamente. Sin embargo, si escribe f $ g $ h
, no funcionará.
Creo que la razón por la que el autor prefiere el método de composición es porque conduce a una buena práctica de creación de funciones.
Para mí, creo que la respuesta es (a) la pulcritud, como dijo Don ; y (b) me parece que cuando estoy editando código, mi función puede terminar en un estilo sin puntos, y entonces todo lo que tengo que hacer es borrar los últimos $
lugar de volver atrás y cambiar todo. Un punto menor, sin duda, pero una gracia.
Yo agregaría eso en f . g $ x
f . g $ x
, f . g
f . g
es una unidad sintáctica significativa.
Mientras tanto, en f $ g $ x
, f $ g
no es una unidad significativa. Una cadena de $
es indiscutiblemente más imperativa: primero obtenga el resultado de g
de x
, luego haga f
, luego haga foo
, etc.
Mientras tanto una cadena de .
es posiblemente más declarativo y, en cierto sentido, más cercano a una visión centrada en el flujo de datos: componga una serie de funciones y, finalmente, aplíquelas a algo.