Quale è più efficiente in Haskell; pattern matching o istruzioni if ??/ case nidificate?
-
06-07-2019 - |
Domanda
Sono solo curioso dell'efficienza del pattern matching in Haskell. Qual è un semplice caso in cui la corrispondenza dei modelli sarebbe migliore delle istruzioni nidificate se
/
case
e poi il contrario?
Grazie per il tuo aiuto.
Soluzione
In Haskell, case
e la corrispondenza dei motivi sono indissolubilmente legati; non puoi averne uno senza l'altro. se p allora e1 else e2
è zucchero sintattico per case p di {True - > e1; Falso - > e2}
. Per questi motivi, penso che sia impossibile produrre gli esempi richiesti; in Core Haskell, tutto equivale a case
.
Nelle lingue della famiglia ML, l'ottimizzatore può spesso fare cose molto impressionanti con combinazioni di schemi complesse. Questo è più difficile per i compilatori Haskell; a causa della valutazione lenta, al compilatore di pattern-match non è consentito riordinare determinati test. In altre parole, se annidate le istruzioni case
in modi diversi, potreste ottenere prestazioni diverse, ma in Haskell otterrete anche semantiche diverse. Quindi generalmente il compilatore non si scherza.
Per quanto riguarda il modo in cui scrivere il proprio codice, è lecito ritenere che il codice con il minor numero di espressioni maiuscole sia il migliore (tenendo presente che un if
equivale a un'espressione maiuscola) .
Altri suggerimenti
Non l'ho confermato, ma penso che entrambi i moduli diventeranno un caso nidificato di espressione quando tradotto dal compilatore al core Haskell. Il modo migliore per scoprirlo è chiedere al compilatore stesso. In GHC puoi attivare il dump del programma intermedio principale usando gli argomenti:
- Prima delle semplificazioni: -ddump-ds
- Dopo le semplificazioni: -ddump-simpl
Secondo le specifiche, sono semanticamente equivalente . Questo, ovviamente, non significa necessariamente che siano implementati in modo identico, ma sarei personalmente sorpreso se ci fosse una differenza in un compilatore decente.