Einfache Frage: Warum löst das nicht die Rewrite-Regel aus?Wie fmp rewrite Regeln auslösen?
{-# RULES "fmap/fmap" forall f g xs. fmap f (fmap g xs) = fmap (f.g) xs #-}
main = do
txt <- fmap head (fmap words (readFile "foo.txt"))
print txt
Jetzt wollte ich, dass fun
die Regel löst das Extrahieren schreiben, weil es in einem früheren Test tat ... diesmal nicht.
{-# RULES "fmap/fmap" forall f g xs. fmap f (fmap g xs) = fmap (f.g) xs #-}
fun f g xs = fmap f (fmap g xs)
main = do
txt <- fun (drop 1) words (readFile "foo.txt")
print txt
Bis ich zufällig hat einen Modulname:
module Main where
{-# RULES "fmap/fmap" forall f g xs. fmap f (fmap g xs) = fmap (f.g) xs #-}
fun f g xs = fmap f (fmap g xs)
main = do
txt <- fun head words (readFile "foo.txt")
print txt
Jetzt noch funktioniert es nicht, wenn ich in der Hauptfunktion die Funktion Anwendung schreiben gerade.
Um es zusammenzufassen:
txt <- fmap head (fmap words (readFile "foo"))
nicht- funktioniert
txt <- fun head words (readFile "foo")
funktioniert nicht txt <- fun head words (readFile "foo")
plus Modulfun f g xs = fmap f . fmap g $ xs
arbeitet plus Modul funktioniert nichtfun f g xs = f <$> (g <$> xs)
plus Modul funktioniert (aber später ausgelöst)
All dies durch den Aufruf ghc --make -O2 -ddump-rule-firings Main.hs
gemacht wurde. Beispielausgabe:
# ghc --make -O2 -ddump-rule-firings Main.hs
[1 of 1] Compiling Main (Main.hs, Main.o)
Rule fired: fmap/fmap
Rule fired: unpack
Rule fired: Class op >>=
Rule fired: Class op fmap
Rule fired: Class op fmap
Rule fired: Class op show
Rule fired: Class op showList
Rule fired: unpack-list
Linking Main ...
Nur als eine Nebenfrage: Weiß jemand, was diese 'Class op' Regeln sind? Nach ihnen zu suchen, konnte ich nicht herausfinden. Abgesehen davon: 'rewrite-rules' tag? Scheint nicht üblich genug, um seine Schöpfung zu rechtfertigen. – fho
Die 'Class op'-Regeln werden von GHC für monomorphes Auftreten von überladenen Funktionen erstellt. Siehe 'compiler/basicTypes/MkId.lhs' in GHC (suche nach' "Class op" '): _Dies ist die eingebaute Regel, die' op (dfT d1 d2) ---> opT d1 d2'_ – Cactus