gpt4 book ai didi

haskell - 使用具有多个数据构造函数的相同镜头

转载 作者:行者123 更新时间:2023-12-02 10:41:43 25 4
gpt4 key购买 nike

假设我有这样的类型:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com