假设我有一个这样的类型:

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

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

最佳答案

不要不同意 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)

关于haskell - 对多个数据构造函数使用相同的镜头,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29309813/

10-12 19:58