タイプを考えると
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)
データ構造の 1 回の走査で 3 つすべてを同時に抽出する方法はありますか?
Getter
を組み合わせる何らかのGetter s a -> Getter s b -> Getter s (a,b)
方法