8

次のコードがあるとします。

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

1 に答える 1

15

とのインスタンスを使用GeneralizedNewtypeDerivingして派生させます。あなたの例のサンプルコードは次のとおりですIsStringFirstnameLastname

{-# 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 を使用して、必要な同様の関数を作成できますが、それらの関数を別のモジュールに保持してからここにインポートする場合、努力する価値はありません。

于 2013-06-15T17:30:59.227 に答える