2013-06-15 5 views
7

den folgenden Code Gegeben:Wie kann ich Textbausteine ​​beim Schreiben von überladenen Strings entfernen?

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

ich stark typisierten Strings um die Erstellung den Textvorschlag löschen möchte. Ist es möglich, Template Haskell (oder ein anderes Mittel) zu verwenden, um dies zu erreichen?

zB so etwas wie:

{-# LANGUAGE OverloadedStrings, TemplateHaskell #-} 

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

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

Antwort

14

Verwendung GeneralizedNewtypeDeriving und leiten die IsString Instanz für Firstname und Lastname. Ein Beispielcode für Ihr Beispiel folgt

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

Sie können TH verwenden eine ähnliche Funktion zu schreiben, die Sie wollen, aber es ist nicht der Mühe wert, während diese Funktionen in einem separaten Modul zu halten und sie dann hier zu importieren.

Verwandte Themen