Si dovrebbe usare Template Haskell. Con TH è possibile generare codice a livello di codice, in fase di compilazione. In questo caso il tuo mymodulus è effettivamente un "modello".
Ad esempio, è possibile riscrivere il programma come segue, per calcolare staticamente la funzione. In primo luogo, il codice principale, come al solito, ma invece di chiamare la funzione modulo, si chiama una funzione il cui corpo è una giunta che verrà generato in fase di compilazione:
{-# LANGUAGE TemplateHaskell #-}
import Table
mymodulus n = $(genmodulus 64)
main = mapM_ (print . mymodulus) [0..64]
E il codice per generare la tabella staticamente:
{-# LANGUAGE TemplateHaskell #-}
module Table where
import Language.Haskell.TH
import Language.Haskell.TH.Syntax
genmodulus :: Int -> Q Exp
genmodulus n = return $ CaseE (VarE (mkName "n"))
[ Match (LitP (IntegerL i))
(NormalB (LitE (IntegerL (i `mod` base))))
[]
| i <- [0..fromIntegral n] ]
where
base = 10
Descrive la sintassi astratta dell'espressione case, che verrà generata in fase di compilazione. Abbiamo semplicemente generiamo un grande interruttore:
genmodulus 64
======>
case n of {
0 -> 0
1 -> 1
2 -> 2
3 -> 3
4 -> 4
...
64 -> 4 }
Si può vedere ciò che il codice viene generato con -ddump-giunzioni. Ho scritto il codice del modello in stile diretto. Qualcuno più familiare con TH dovrebbe essere in grado di rendere più semplice il codice del pattern.
Un'altra opzione sarebbe quella di generare una tabella di valori offline e importare semplicemente quella struttura di dati.
Si potrebbe anche dire perché si desidera fare questo. Suppongo tu abbia una funzione molto complessa basata su tabelle?
fonte
2010-03-19 09:20:24
Ho una tabella di '[Integer -> Intero]'. Fondamentalmente, dato un valore, genera un nuovo elenco di valori che sono stati creati usando quella funzione da quella lista. Posso costruire automaticamente quegli elenchi di funzioni. Ogni elenco nella tabella può contenere un numero qualsiasi di funzioni. Fondamentalmente basato su un'operazione 'mod' sceglie una lista da usare.Ma questo significa che posso già costruirli in fase di compilazione. – Egon