记录访问器继承的模板 Haskell 函数
Template Haskell Function for Record Accessor Inheritance
我有两种数据类型,A
和 B
,我将其定义为:
data A = A { aFoo :: Int, aBar :: String }
data B = B { bFoo :: Int, bBar :: String, bBaz :: Float }
我现在需要创建一个 A
和 B
的异构列表,所以我定义了一个求和类型,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 比较陌生。感谢您的帮助。
{-# 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
和 _CB
.
我建议您阅读本教程:lens over tea #6: Template Haskell。
我有两种数据类型,A
和 B
,我将其定义为:
data A = A { aFoo :: Int, aBar :: String }
data B = B { bFoo :: Int, bBar :: String, bBaz :: Float }
我现在需要创建一个 A
和 B
的异构列表,所以我定义了一个求和类型,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 比较陌生。感谢您的帮助。
{-# 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
和 _CB
.
我建议您阅读本教程:lens over tea #6: Template Haskell。