我有两种数据类型,A
和B
,我将其定义为:
data A = A { aFoo :: Int, aBar :: String }
data B = B { bFoo :: Int, bBar :: String, bBaz :: Float }
我现在需要创建A
和B
s的异构列表,因此我将和类型C
定义为:
data C = CA A | CB B
我现在要定义函数
cFoo :: C -> Int
cBar :: C -> String
这可以通过模式匹配来实现......
cFoo (CA a) = aFoo a
cFoo (CB b) = bFoo b
cBar (CA a) = aBar a
cBar (CB b) = bBar b
...但是这对于许多字段的数据类型来说变得乏味。我想知道是否有一个使用模板Haskell的简单解决方案,或者它是否值得付出努力。我对Haskell有中级知识,但对模板Haskell来说相对较新。任何帮助表示赞赏。
答案 0 :(得分:1)
{-# LANGUAGE TemplateHaskell #-}
import Control.Lens
data A =
A
{ _aFoo :: Int
, _aBar :: String
}
data B =
B
{ _bFoo :: Int
, _bBar :: String
, _bBaz :: Float
}
makeLenses ''A
makeLenses ''B
data C
= CA A
| CB B
makePrisms ''C
这将为您提供七项功能:aFoo
,aBar
,bFoo
,bBar
,bBaz
,_CA
和{{1} }。
我建议你阅读本教程:lens over tea #6: Template Haskell。