用于记录访问器继承的模板Haskell函数

时间:2015-08-17 01:38:02

标签: haskell template-haskell

我有两种数据类型,AB,我将其定义为:

data A = A { aFoo :: Int, aBar :: String }
data B = B { bFoo :: Int, bBar :: String, bBaz :: Float }

我现在需要创建AB 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来说相对较新。任何帮助表示赞赏。

1 个答案:

答案 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

这将为您提供七项功能:aFooaBarbFoobBarbBaz_CA和{{1} }。

我建议你阅读本教程:lens over tea #6: Template Haskell