2011-12-23 9 views
16

In Haskell, spesso scrivo espressioni con $ s. Lo trovo abbastanza naturale e leggibile, ma a volte leggo che è una cattiva forma e non capisco perché dovrebbe essere.

+7

Avete un riferimento per cui è descritto come una cattiva forma? – bobbymcr

+0

Risposta breve: no. –

risposta

22

Di seguito sono tutti una buona forma:

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

li ho messi in ordine sparso la mia preferenza, anche se il gusto come sempre varia, e il contesto può richiedere una scelta diversa. Ho anche occasionalmente visto

foo = bar 
    . baz 
    . quux 

quando ciascuno dei bar, baz, e quux sottoespressioni sono lunghi. La seguente è una cattiva forma:

foo x = bar $ baz $ quux $ x 

Ci sono due motivi per cui è meno preferibile. Innanzitutto, un numero inferiore di sottoespressioni può essere copiato e incollato in una definizione ausiliaria durante il refactoring; con tutti gli operatori ($), solo le sottoespressioni che includono l'argomento x sono refatture valide, mentre con gli operatori (.) e ($) è possibile estrarre anche sottoespressioni come bar . baz o baz . quux in una definizione separata.

Il secondo motivo per preferire (.) è in previsione di una possibile modifica alla fissità di ($); Al momento, è ($)infixr, il che significa che associa a destra, in questo modo:

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

Tuttavia, ($) sarebbe utile in più espressioni se fosse infixl; ad esempio, qualcosa come

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

... che attualmente non può essere espresso senza parentesi. L'esempio "cattiva forma", quando analizzato con un'applicazione infixl, sarebbe

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

che significa qualcosa di molto diverso. Quindi, prova il tuo codice a prova di futuro evitando questo modulo.

+6

Ho anche visto occasionalmente cose come 'bar. baz $ quux x' o 'bar (baz. quux $ x)' o altre miscele, tipicamente quando sono coinvolti altri operatori di infisso, o quando determinate applicazioni di funzione vengono enfatizzate concettualmente. –

+6

IMO, l'argomento della fissità è meno convincente del fatto che lo stile di composizione consente di ridefinire la pipeline in una funzione con un semplice copia-incolla. – ehird

+0

Con la sua attuale fissità, se si ha 'bar $ baz $ quux $ x', questo è equivalente a' bar. baz. quux $ x'. Quest'ultimo è, naturalmente, incoraggiato al primo. –

Problemi correlati