2016-09-08 1 views
3

Je l'ai utilisé SYB depuis longtemps, et ont souvent des fonctions commeComment remplacer Data.Generics avec GHC.Generics?

friendlyNames :: Data a => a -> a 
friendlyNames = everywhere (mkT (\(Name x _) -> Name x NameS)) 

Quel est l'équivalent de ce en utilisant GHC.Generics, en supposant générique un?

+0

Je pense que la réponse peut être Data.Generics.Uniplate.Operations. –

+1

Où sont les définitions de 'Name' et' NameS'? –

+0

Ils proviennent de Language.Haskell.TH.Syntax - c'est-à-dire template-haskell. –

Répondre

2

Cela pourrait être le mauvais problème à résoudre avec GHC.Generics, mais voici maintenant vous le feriez! L'approche GHC.Generics est plus adaptée aux situations où ce type de complexité peut être écrit une fois et caché dans une bibliothèque. Alors que l'approche SYB repose sur des contrôles d'exécution, observer le noyau GHC qui est généré pour un friendlyNames qui fait présentent des valeurs amicales

-- RHS size: {terms: 14, types: 18, coercions: 0} 
recordFriendlyNames 
recordFriendlyNames = 
    \ w_s63w -> 
    case w_s63w of _ { Record ww1_s63z ww2_s63A ww3_s63B -> 
    case $recordFriendlyNames ww1_s63z ww2_s63A ww3_s63B 
    of _ { (# ww5_s63H, ww6_s63I, ww7_s63J #) -> 
    Record ww5_s63H ww6_s63I ww7_s63J 
    } 
    } 

-- RHS size: {terms: 19, types: 19, coercions: 0} 
$recordFriendlyNames 
$recordFriendlyNames = 
    \ ww_s63z ww1_s63A ww2_s63B -> 
    (# ww_s63z, 
     case ww1_s63A of _ { 
     Nothing -> Nothing; 
     Just g1_a601 -> Just (recordFriendlyNames g1_a601) 
     }, 
     case ww2_s63B of _ { Name x_a3Z3 ds_d5Z5 -> Name x_a3Z3 NameS } #) 
+0

Pour 'V1' avec GHC récent, je choisirais' gfriendlyNames v = case v de {} '. Je pense que cela exprime le point plus clairement. – dfeuer