2013-06-15 17 views
7

Dato il seguente codice:Come posso rimuovere lo standard quando si scrivono stringhe sovraccariche?

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

mi piacerebbe rimuovere il boilerplate intorno creando stringhe fortemente tipizzato. È possibile utilizzare Template Haskell (o qualche altro mezzo) per raggiungere questo obiettivo?

ad esempio qualcosa come:

{-# LANGUAGE OverloadedStrings, TemplateHaskell #-} 

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

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

risposta

14

Usa GeneralizedNewtypeDeriving e derivare l'istanza IsString per Firstname e Lastname. Un codice di esempio per il vostro esempio segue

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

È possibile utilizzare TH per scrivere una funzione simile che si desidera, ma non vale la pena, mantenendo le funzioni in un modulo separato e poi importarli qui.

Problemi correlati