2015-10-07 9 views
5

मैं डेटाप्रकार निम्नलिखित रिकॉर्डरिकॉर्ड फ़ील्ड पर फिर से कैसे चलें?

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

मैं Config के प्रत्येक क्षेत्र से अधिक पुनरावृति करना चाहते हैं के रूप में परिभाषित किया है, उदाहरण के tail के लिए, कुछ समारोह String -> String लागू करते हैं और में नए Config वापसी मिलता है।

ऐसा करने के लिए बेवकूफ तरीका क्या है? अधिमानतः, भारी तृतीय पक्ष पुस्तकालयों के बिना।

+2

'head' फ़ंक्शन एक' Char' सबसे अच्छा तरीका होगा। क्या मैं समझने में सही हूं कि आप चाहते हैं कि आपूर्ति किए गए फ़ंक्शन के आधार पर आप अपने फ़ील्ड के प्रकार को बदल दें? –

+1

uniplate एक हल्के जेनेरिक लाइब्रेरी है जो शायद आसानी से ऐसा कर सकता है। – jberryman

+0

@ माइकलस्टेल मेरी गलती, 'पूंछ' की तरह कुछ जो एक ही प्रकार 'स्ट्रिंग' लौटाएगा। मैंने प्रश्नों को अपडेट किया है –

उत्तर

13

ठीक है, ऐसा करने के लिए यह शायद

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

मोनोट्रावर्सबल के बाद फ़ील्ड के लिए केस लॉजिक प्रदान करना एक विकल्प होगा। –

+0

तारों के लिए, यह जाने का स्पष्ट तरीका लगता है। यह दुर्भाग्यपूर्ण है कि यह दृष्टिकोण कुछ अन्य परिस्थितियों में अच्छे अनुकूलन को रोकता है। – dfeuer

संबंधित मुद्दे