Dar*_*ren 8 haskell template-haskell
给出以下代码:
{-# 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
Run Code Online (Sandbox Code Playgroud)
我想删除围绕创建强类型字符串的样板.有可能使用Template Haskell(或其他一些方法)来实现这一目标吗?
例如:
{-# LANGUAGE OverloadedStrings, TemplateHaskell #-}
$(strongString ''Firstname)
$(strongString ''Lastname)
data Person = Person { firstname :: Firstname, lastname :: Lastname, age :: Int } deriving Show
Run Code Online (Sandbox Code Playgroud)
Sat*_*vik 15
使用GeneralizedNewtypeDeriving并导出IsString实例for 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
Run Code Online (Sandbox Code Playgroud)
您可以使用TH编写您想要的类似函数,但将这些函数保存在单独的模块中然后在此处导入它们是不值得的.
| 归档时间: |
|
| 查看次数: |
624 次 |
| 最近记录: |