假设我有这样的类型:
data Stock = Stock {
_stockSymbol :: String,
_stockFairValue :: Float,
_stockBuyAt :: Float,
_stockCurrentPrice :: Float
} |
Etf {
_etfSymbol :: String,
_etfFairValue :: Float,
_etfBuyAt :: Float,
_etfCurrentPrice :: Float
} deriving (Eq)
Stock
和Etf
都有相同的字段。现在我想访问其中一个符号:
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
不确定是否有内置方式,我不必写出字段。
答案 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)