2015-10-07 18 views
5

Ich habe folgende Datentyp als Datensatz definiertWie über Datensatzfelder iterieren?

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

ich auf jedes Feld von Config iterieren möchten, wenden Sie eine Funktion String -> String, zum Beispiel tail und in neue Config zurückkehren lassen.

Was ist idiomatische Art, dies zu tun? Vorzugsweise ohne schwere Bibliotheken von Drittanbietern.

+2

Die 'head' Funktion gibt einen' Char' wäre. Ist es richtig zu verstehen, dass Sie den Typ Ihrer Felder abhängig von der zurückgegebenen Funktion ändern möchten? –

+1

Uniplate ist eine leichtgewichtige Generics-Bibliothek, die das wahrscheinlich leicht tun kann. – jberryman

+0

@MichaelSteele meine Schuld, etwas wie 'tail', das den gleichen Typ' String' zurückgibt. Ich habe Fragen aktualisiert –

Antwort

13

Nun, der beste Weg, es wahrscheinlich zu tun

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

monotraversable wäre eine Alternative. –

+0

Für Saiten scheint dies der naheliegendste Weg zu sein. Es ist bedauerlich, dass dieser Ansatz nette Optimierungen in einigen anderen Situationen verhindert. – dfeuer