2016-02-16 24 views
5
{-# LANGUAGE PatternSynonyms, ViewPatterns #-} 

data Quun = Foo | Bar | Oink Quun 

fooey :: Quun -> Bool 
fooey Foo = True 
fooey (Oink Yum) = True 
fooey _ = False 

pattern Yum <- (fooey -> True) 

Questo non compila (almeno in GHC-7.10.2)Perché tutti i sinonimi di pattern ricorsivi sono stati rifiutati?

/tmp/wtmpf-file10227.hs:1:1: 
    Recursive pattern synonym definition with following bindings: 
     foo (defined at /tmp/wtmpf-file10227.hs:(6,1)-(8,13)) 
     Yum (defined at /tmp/wtmpf-file10227.hs:10:1-28) 

Certo, per semplici motivi direttamente auto-referenti questo avrebbe senso. Ma c'è qualche ragione fondamentale per cui anche un layout mediato da una visualizzazione come sopra non è possibile? Non riesco a trovare questo convincente; dopo tutto è possibile inline il modello vista e ottenere un perfettamente innocua (beh ... almeno, ammessi) Definizione:

fooey :: Quun -> Bool 
fooey Foo = True 
fooey (Oink (fooey -> True)) = True 
fooey _ = False 

pattern Yum <- (fooey -> True) 

Quindi, sono questi i sinonimi semplicemente non ancora disponibile per motivi tecnici, e la volontà li otteniamo in futuro?

+0

Autore di 'PatternSynonyms' qui: questo è un buon punto e vale la pena aprire un biglietto per. Questo potrebbe non essere facile da implementare, però, perché, se ricordo bene, GHC non espone molte informazioni sul "perché" qualcosa finisce nell'insieme di variabili libere. – Cactus

risposta

5

Alcuni modelli ricorsivi sono problematici, come

f :: [()] -> Bool 
f L = True 
f _ = False 

pattern L <-() : L 

Cosa è questo dovrebbe desugar a?

I motivi non sono valori di prima classe. Sono appena sostituiti con le loro definizioni dove appaiono. Per un tale linguaggio, le definizioni ricorsive non sono generalmente sensibili.

+2

Bene, non ho suggerito che i normali sinonimi bidirezionali dovrebbero essere autorizzati a essere ricorsivi. Solo con i modelli di visualizzazione può avere senso; ma poi potrebbe consentire alcune buone applicazioni in effetti. – leftaroundabout

+2

Beh 'L' è un sinonimo di pattern ricorsivo e deve essere rifiutato, quindi corrisponde al titolo della tua domanda. Sono d'accordo che quando la ricorsione passa attraverso una funzione, potrebbe andare bene. –

Problemi correlati