2013-06-15 14 views
7

Biorąc pod uwagę następujący kod:Jak mogę usunąć skróconą tablicę przy pisaniu przeciążonych łańcuchów?

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

Chciałbym usunąć boilerplate wokół tworzenia silnie wpisany sznurki. Czy można użyć szablonu Haskell (lub innych środków), aby to osiągnąć?

przykład coś takiego:

{-# LANGUAGE OverloadedStrings, TemplateHaskell #-} 

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

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

Odpowiedz

14

Zastosowanie GeneralizedNewtypeDeriving i czerpać instancję IsString dla Firstname i Lastname. Próbkę kodu dla przykładu następujący

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

Można użyć TH napisać podobną funkcję, które chcesz, ale to nie jest warte wysiłku, zachowując te same funkcje w oddzielnym module, a następnie importować je tutaj.

Powiązane problemy