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

Template Haskell Function for Record Accessor Inheritance

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

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

我现在需要创建一个 AB 的异构列表,所以我定义了一个求和类型,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

这将为您提供七个函数:aFooaBarbFoobBarbBaz_CA_CB.

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