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.
risposta
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.
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. –
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
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. –
- 1. Blocco su un oggetto mutabile - Perché è considerato una cattiva pratica?
- 2. È una cattiva forma per sincronizzare NSUserDefaults in - (void) dealloc?
- 3. È una cattiva forma escludere godocs sui nomi esportati?
- 4. Perché Marshal.DestroyStructure è considerato puro?
- 5. È una cattiva forma fornire solo un costruttore di mosse?
- 6. Python: è una cattiva forma generare eccezioni all'interno di __init__?
- 7. Perché è una cattiva pratica -compile (export_all)?
- 8. jQuery è considerato una lingua?
- 9. Perché "Password dimenticata" è cattiva?
- 10. È considerato una cattiva pratica che gli oggetti ViewModel mantengano il Dispatcher?
- 11. È considerata una cattiva forma eseguire una funzione all'interno di un'istruzione condizionale?
- 12. Il C++ è considerato debolmente digitato? Perché?
- 13. Perché WordPress è considerato mal programmato?
- 14. L'output di HTML con echo è considerato una cattiva pratica in PHP?
- 15. Perché javascript: void (0) è considerato dannoso?
- 16. Il typoperf'ing è un tipo di puntatore considerato una cattiva pratica?
- 17. Perché questo array Java è considerato bidimensionale?
- 18. I loop infiniti sono in cattiva forma?
- 19. Perché una forma di proprietà è distrutta dopo la forma del proprietario stesso?
- 20. Quando/perché è una cattiva idea usare la funzione fscanf()?
- 21. È una cattiva forma riferirsi a un tipo derivato in un tipo di base?
- 22. Il sovraccarico del metodo è considerato polimorfismo?
- 23. L'operatore del dollaro ($) è supportato in elm?
- 24. Perché la cattura (eccezione) è quasi sempre una cattiva idea?
- 25. Perché è una cattiva idea consentire questi in JavaScript ==,! =, ++, -
- 26. selezionare $ (simbolo del dollaro)
- 27. È una cattiva forma restituire gli array in C#? Devo restituire la lista <T>?
- 28. `qrefresh` è considerato dannoso?
- 29. L'uso del pacchetto predefinito di Java è una cattiva pratica?
- 30. Implementazione del servizio Windows IDisposable - È una cattiva pratica?
Avete un riferimento per cui è descritto come una cattiva forma? – bobbymcr
Risposta breve: no. –