2013-06-15 15 views
7

Aşağıdaki kodu verilen:Aşırı yüklenen dizeleri yazarken boiler plakasını nasıl kaldırabilirim?

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

Ben kesinlikle yazılan dizeleri oluşturarak etrafında klişe kaldırmak istiyorum. Bunu başarmak için Template Haskell'i (veya başka bir yolla) kullanmak mümkün mü? gibi

örn şey:

{-# LANGUAGE OverloadedStrings, TemplateHaskell #-} 

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

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

cevap

14

Kullanım GeneralizedNewtypeDeriving ve Firstname ve Lastname için IsString örneği türetmek. senin örneğin bir örnek kod

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

İstediğiniz benzer bir işlevi yazmak TH kullanabilirsiniz izler ama burada onları ithal ardından ayrı modülde bu işlevleri tutmak ve ederken çabaya değmez.

İlgili konular