2015-10-07 34 views
5

Ben veri türü aşağıdaki kayıtKayıt alanları üzerinde nasıl yineleme yapılır?

Ben Config her alanın üzerine yineleme istiyorum
data Config = Config 
    { field1 :: String 
    , field2 :: String 
    , field3 :: String 
    } 

olarak tanımladık, örneğin tail için, bazı fonksiyon String -> String uygulamak ve içinde Config yeni return olsun.

Bunu yapmanın deyimsel yolu nedir? Tercihen, ağır 3. parti kütüphaneleri olmadan.

+2

'head' işlevi' Char' döndürür olacağını yapmanın en iyi yolu. Sağlanan işlevin ne kadar geri döndüğüne bağlı olarak alanlarınızın türünün değişmesini istediğinizi anlıyor musunuz? –

+1

uniplate, muhtemelen bunu kolayca yapabilecek hafif bir jenerik kitaplığıdır. – jberryman

+0

@MichaelSteele benim hatam, aynı tür 'String' döndürecek' tail' gibi bir şey. Sorularımı güncelledim –

cevap

13

Evet, muhtemelen

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

tek yönlü bir alternatif olurdu. –

+0

Dizeler için, bu gitmek için bariz bir yol gibi görünüyor. Bu yaklaşımın, bazı diğer durumlarda iyi optimizasyonları önlediği talihsiz bir durumdur. – dfeuer

İlgili konular