2015-07-01 12 views
5

che sto guardando il codice sorgente della libreria pipes e per esempio nel Core module non capisco il motivo per cui l'autore è tutto il luogo utilizzando il modello di funzioni che definiscono così:perché tubi definisce le funzioni interne

runEffect = go 
    where 
    go p = ... 

Oppure:

pull = go 
    where 
    go a' = ... 

Oppure:

reflect = go 
    where 
    go p = ... 

I s questo qualche trucco per abilitare alcune ottimizzazioni? Lo trovo brutto, se si tratta di un trucco di ottimizzazione vorrei davvero che il compilatore potesse farlo senza cose del genere. Ma forse c'è un'altra ragione?

risposta

7

GHC eseguirà solo funzioni non ricorsive in linea e solo quando sono "applicate completamente" da un punto di vista sintattico (ovvero nel sito di chiamata vengono applicate al numero di argomenti visualizzati nella parte sinistra in la definizione).

Negli esempi che hai postato non ci sono argomenti, tuttavia le definizioni sono probabilmente ricorsive e non sarebbero in linea. Effettuare questa trasformazione probabilmente consente di definire le definizioni e specializzarle (per i tipi concreti di m ecc.) Nel sito di chiamata.

È questo un trucco per abilitare alcune ottimizzazioni? Lo trovo brutto, se è un trucco di ottimizzazione, vorrei davvero che il compilatore potesse farlo senza cose del genere.

Sì, è superlame.

+2

'pipes' è una piccola libreria con astrazioni componibili che possono essere utilizzate per creare molte logiche complesse, quindi è naturale che l'ottimizzazione pesante si ripaga a livello di libreria di base. Ha anche regole di riscrittura non banali. Al contrario, nel normale codice di produzione non è necessario occuparsi di involucri manuali. Di solito GHC lo fa bene. –

+1

Grazie. Grazie alle tue parole chiave "completamente applicate", mi sono imbattuto in questo: http://stackoverflow.com/questions/11690146/why-does-ghc-consider-the-lhs-syntactically-when-inining che spero condivideranno un po 'più di luce sul problema per me. È piuttosto deludente vedere tutte le altre magie che haskell può raggiungere. –

+0

se è così facile "in linea" una funzione ricorsiva, perché GHC non fa questo trucco da solo? – mb14