2015-10-07 19 views
5

Ho seguente tipo di dati definiti come record diCome eseguire iterazioni sui campi dei record?

data Config = Config 
    { field1 :: String 
    , field2 :: String 
    , field3 :: String 
    } 

voglio iterare su ogni campo di Config, applicare qualche funzione String -> String, ad esempio tail e ottiene in cambio nuova Config.

Qual è il modo idiomatico per farlo? Preferibilmente, senza pesanti librerie di terze parti.

+2

La funzione 'head' restituisce un' char'. Ho ragione di capire che vuoi cambiare il tipo dei tuoi campi a seconda di cosa restituisce la funzione fornita? –

+1

uniplate è una libreria generica leggera che probabilmente può farlo facilmente. – jberryman

+0

@MichaelSteele colpa mia, qualcosa come 'tail' che restituirà lo stesso tipo' String'. Ho aggiornato le domande –

risposta

13

Bene, il modo migliore per farlo sarebbe probabilmente

{-# LANGUAGE DeriveFunctor #-} 

type Config = Config' String 
data Config' a = Config 
    { field1 :: a 
    , field2 :: a 
    , field3 :: a 
    } deriving (Functor) 

configHeads :: Config -> Config' Char 
configHeads = fmap head 
+0

monotraversibile sarebbe un'alternativa. –

+0

Per le stringhe, questo sembra l'ovvio modo di andare. È un peccato che questo approccio prevenga delle belle ottimizzazioni in alcune altre situazioni. – dfeuer

Problemi correlati