Quale è più efficiente in Haskell; pattern matching o istruzioni if ??/ case nidificate?

StackOverflow https://stackoverflow.com/questions/426953

  •  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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top