Với loạiSử dụng một ống kính để đọc nhiều lĩnh vực
data Prisoner = P { _name :: String
, _rank :: Int
, _cereal :: Cereal }
data Cereal = C { _number :: Int
, _percentDailyValue :: Map String Float
, _mascot :: String }
tôi có thể trích xuất tên của ai đó, cấp bậc, và số ngũ cốc qua khớp mẫu:
getNameRankAndCerealNumber_0 :: Prisoner -> (String, Int, Int)
getNameRankAndCerealNumber_0 (P { _name=name
, _rank=rank
, _cereal = C { _number=cerealNumber }}
) = (name, rank, cerealNumber)
Cách khác, tôi có thể sử dụng ống kính để trích xuất từng phần riêng biệt
makeLenses ''Cereal
makeLenses ''Prisoner
getNameRankAndCerealNumber_1 :: Prisoner -> (String, Int, Int)
getNameRankAndCerealNumber_1 p = (p ^. name, p ^. rank, p ^. cereal.number)
Có cách nào trích xuất cả ba đồng thời trong một lần truyền tải đơn lẻ cấu trúc dữ liệu?
Một số cách để kết hợp Getter
s, Getter s a -> Getter s b -> Getter s (a,b)
?
Bạn có nghĩa là "số sêri" hay đây là một số trò đùa mà tôi không nhận được? –
Tom Ellis: Nó chỉ là một trò chơi xấu. – rampion
nguồn cảm hứng ban đầu của tôi là [việc sử dụng mẫu phù hợp với yêu cầu kéo này cố gắng để làm việc với ghc 7.8. *] (Https://github.com/schell/hdevtools/pull/1). Nếu mã đã sử dụng máy nhổ hoặc ống kính trường, thì nó sẽ không cần phải sửa chữa. – rampion