首页 > 解决方案 > 使用镜头访问字段

问题描述

我有以下数据类型:

data Car = Car String Integer
  deriving (Eq, Ord, Show)

data City =
  City
    { cityVehicle     :: Car
    }
  deriving (Generic, Show)

makeLensesWith abbreviatedFields ''Withdrawal

我正在尝试创建一个 lambda 函数来按汽车的“价格”过滤城市,如下所示:

  filter (\city -> (city ^. vehicle . ) <= thresholdPrice) cities

但我不确定如何访问第二个字段Car

标签: haskell

解决方案


你可以手写镜头(我不知道字段代表什么,所以我猜了型号和价格):

model :: Lens' Car String
model f (Car m p) = fmap (\m' -> Car m' p) (f m)

price :: Lens' Car Integer
price f (Car m p) = fmap (\p' -> Car m p') (f p)

推荐阅读