{-# 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?
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