2013-06-15 2 views
7

को देखते हुए निम्नलिखित कोड:अतिभारित तार लिखते समय मैं बॉयलरप्लेट को कैसे हटा सकता हूं?

{-# LANGUAGE OverloadedStrings #-} 

newtype Firstname = Firstname String deriving (Eq, Show) 
instance IsString Firstname where fromString = Firstname 

newtype Lastname = Lastname String deriving (Eq, Show) 
instance IsString Lastname where fromString = Lastname 

data Person = Person { firstname :: Firstname, lastname :: Lastname, age :: Int } deriving Show 

मैं दृढ़ता से टाइप तार बनाने संबंधी बॉयलरप्लेट निकालना चाहते हैं। यह प्राप्त करने के लिए टेम्पलेट हास्केल (या कुछ अन्य साधन) का उपयोग करना संभव है?

जैसे की तरह कुछ:

{-# LANGUAGE OverloadedStrings, TemplateHaskell #-} 

$(strongString ''Firstname) 
$(strongString ''Lastname) 

data Person = Person { firstname :: Firstname, lastname :: Lastname, age :: Int } deriving Show 

उत्तर

14

उपयोग GeneralizedNewtypeDeriving और Firstname और Lastname के लिए IsString उदाहरण निकाले जाते हैं। अपने उदाहरण के लिए एक नमूना कोड

{-# LANGUAGE OverloadedStrings, GeneralizedNewtypeDeriving #-} 
import Data.String 

newtype Firstname = Firstname String deriving (Eq, Show, IsString) 

newtype Lastname = Lastname String deriving (Eq, Show, IsString) 

data Person = Person { firstname :: Firstname 
        , lastname :: Lastname 
        , age :: Int 
        } 

foo = Person "hello" "world" 10 

आप वें उपयोग कर सकते हैं एक समान कार्य जो आप चाहते हैं लिखने के लिए इस प्रकार है, लेकिन यह एक अलग मॉड्यूल में उन कार्यों रखने और फिर उन्हें यहां का आयात करते हुए प्रयास के लायक नहीं है।

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