鑑於類型使用透鏡讀取通過模式匹配多個字段
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)
?在Control.Lens.Reified
提供很多關於getter和褶皺非常有用的實例
runGetter $ (,) <$> Getter number <*> Getter mascot
一般來說,newtypes:
你的意思是「序列號」還是這個笑話,我沒有得到? – 2014-11-03 20:34:30
湯姆埃利斯:這只是一個糟糕的雙關語。 – rampion 2014-11-03 20:41:56
我最初的靈感是[使用模式匹配,這個拉請求試圖使用ghc 7.8。*]工作(https://github.com/schell/hdevtools/pull/1)。如果代碼使用了現場提取器或鏡頭,則不需要修復。 – rampion 2014-11-03 20:51:23