使用与多个数据构造函数相同的镜头

时间:2015-03-27 20:39:27

标签: haskell lens

假设我有这样的类型:

data Stock = Stock {
               _stockSymbol :: String,
               _stockFairValue :: Float,
               _stockBuyAt :: Float,
               _stockCurrentPrice :: Float
             } |
             Etf {
               _etfSymbol :: String,
               _etfFairValue :: Float,
               _etfBuyAt :: Float,
               _etfCurrentPrice :: Float
             } deriving (Eq)

StockEtf都有相同的字段。现在我想访问其中一个符号:

item ^. symbol -- don't care if stock or etf

我可以用类型类做这个,但是我想知道镜头包是否可以自动构建这个镜头?我查看了makeFields函数,但是如果我单独定义了构造函数,它似乎有效:

data Stock = Stock { ... }
data Etf   = Etf { ... }

有什么方法可以将它们保持在同一类型下吗?

编辑:这有效:

makeLensesFor [("_stockSymbol", "symbol"),
               ("_etfSymbol", "symbol"),
               ("_stockFairValue", "fairValue"),
               ("_etfFairValue", "fairValue"),
               ("_stockBuyAt", "buyAt"),
               ("_etfBuyAt", "buyAt"),
               ("_stockCurrentPrice", "currentPrice"),
               ("_etfCurrentPrice", "currentPrice")
               ] ''Stock

不确定是否有内置方式,我不必写出字段。

1 个答案:

答案 0 :(得分:2)

不要不同意bheklilr的评论,但你可以这样做:

data Stock =
         Stock {
           _symbol :: String,
           _fairValue :: Float,
           _buyAt :: Float,
           _currentPrice :: Float
         } |
         Etf {
           _symbol :: String,
           _fairValue :: Float,
           _buyAt :: Float,
           _currentPrice :: Float
         } deriving (Eq)
$(makeLenses ''Stock)