Учитывая типИспользования объектива для чтения несколько полеев
data Prisoner = P { _name :: String
, _rank :: Int
, _cereal :: Cereal }
data Cereal = C { _number :: Int
, _percentDailyValue :: Map String Float
, _mascot :: String }
я мог извлечь кого-то имя, звание и номера зерновых через сопоставление с образцом:
getNameRankAndCerealNumber_0 :: Prisoner -> (String, Int, Int)
getNameRankAndCerealNumber_0 (P { _name=name
, _rank=rank
, _cereal = C { _number=cerealNumber }}
) = (name, rank, cerealNumber)
С другой стороны, я мог бы использовать линзы для извлечения каждая часть отдельно
makeLenses ''Cereal
makeLenses ''Prisoner
getNameRankAndCerealNumber_1 :: Prisoner -> (String, Int, Int)
getNameRankAndCerealNumber_1 p = (p ^. name, p ^. rank, p ^. cereal.number)
Есть ли способ извлечь все три одновременно за один проход структуры данных?
Какой способ сочетания Getter
s, Getter s a -> Getter s b -> Getter s (a,b)
?
Вы имеете в виду «серийный номер» или эта шутка, которую я не получаю? –
Том Эллис: Это просто плохой каламбур. – rampion
моим оригинальным вдохновением было [использование сопоставления шаблонов, которое этот запрос тяги пытается выполнить с помощью ghc 7.8. *] (Https://github.com/schell/hdevtools/pull/1). Если код использовал полевые экстракторы или линзы, это не требовалось бы исправлять. – rampion