2013-06-15 1 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 

Я хотел бы, чтобы удалить шаблонного вокруг создания строго типизированных строк. Можно ли использовать Template Haskell (или некоторые другие средства) для достижения этого?

например что-то вроде:

{-# LANGUAGE OverloadedStrings, TemplateHaskell #-} 

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

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

ответ

14

Использование GeneralizedNewtypeDeriving и получить экземпляр IsString для Firstname и Lastname. Образец кода для примера следует

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

Вы можете использовать TH, чтобы написать аналогичную функцию, которую вы хотите, но это не стоит усилий, сохраняя эти функции в отдельном модуле, а затем импортировать их здесь.