2011-12-23 17 views
16

En Haskell, suelo escribir expresiones con $ '. Lo encuentro bastante natural y legible, pero a veces leo que es de mala calidad y no entiendo por qué debería ser así.

+7

¿Tiene una referencia para donde se describe como mala forma? – bobbymcr

+0

Respuesta corta: no. –

Respuesta

22

Los siguientes son todos buenos formulario:

foo = bar . baz . quux 
foo x = bar . baz . quux $ x 
foo x = (bar . baz . quux) x 
foo x = bar (baz (quux x)) 

yo los he puesto en orden aproximado de mi preferencia, aunque como siempre el sabor varía, y el contexto puede exigir una elección diferente. También he visto de vez en cuando

foo = bar 
    . baz 
    . quux 

cuando cada uno de los bar, baz y quux subexpresiones son largos. La siguiente es mala forma:

foo x = bar $ baz $ quux $ x 

Hay dos razones por las que esto es menos preferible. En primer lugar, se pueden copiar y pegar menos subexpresiones en una definición auxiliar durante la refactorización; con todos los operadores ($), solo las subexpresiones que incluyen el argumento x son refactorizaciones válidas, mientras que con los operadores (.) y ($) incluso las subexpresiones como bar . baz o baz . quux se pueden extraer en una definición separada.

La segunda razón para preferir (.) es en previsión de un posible cambio en la fijeza de ($); Actualmente, es ($)infixr, lo que significa que se asocia a la derecha, así:

foo x = bar $ (baz $ (quux $ x)) 

Sin embargo, ($) sería útil en más expresiones si fuera infixl; por ejemplo, algo así como

foo h = f (g x) (h y) 
foo h = f $ g x $ h y 
foo h = (f $ g x) $ h y 

... que actualmente no se puede expresar sin paréntesis. El ejemplo "de mal gusto", cuando lo analiza con una aplicación infixl, sería

foo x = ((bar $ baz) $ quux) $ x 

que significa algo muy diferente. Por lo tanto, a prueba de futuro su código al evitar esta forma.

+6

También he visto ocasionalmente cosas como 'bar. baz $ quux x' o 'bar (baz. quux $ x)' u otras mezclas, típicamente cuando están involucrados otros operadores de infijo, o cuando se enfatizan conceptualmente aplicaciones de funciones específicas. –

+6

IMO, el argumento de la fijeza es menos convincente que el hecho de que el estilo de composición le permite refactorizar la tubería en una función con un simple cortar y pegar. – ehird

+0

Con su fijeza actual, si tiene 'bar $ baz $ quux $ x', esto es equivalente a' bar. baz. quux $ x'. Este último es, por supuesto, alentado sobre el anterior. –

Cuestiones relacionadas