2015-10-07 9 views
5

私は、レコードレコードフィールドを反復処理する方法は?

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

として定義データ型以下の私は、Configの各フィールドを反復処理するいくつかの機能String -> Stringを適用し、例えば、tailため、戻り新しいConfigで取得したいです。

これを行うにはどのような方法がありますか?好ましくは、重い第三者図書館なし。

+2

だろう。提供された関数が返すものに応じてフィールドの型を変更したいと思っているのを覚えていますか? –

+1

uniplateは、おそらく簡単に行うことができる軽量ジェネリックライブラリです。 – jberryman

+0

@MichaelSteele私のせいで、同じタイプの 'String'を返す' tail'のようなものです。私は質問を更新しました –

答えて

13

まあ、それを行うための最善の方法は、おそらく `head`関数は` Char`を返し

{-# 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が代わりになります。 –

+0

文字列の場合、これは明らかな方法のようです。このアプローチが他の状況では最適化を妨げるのは残念です。 – dfeuer

関連する問題