鉴于类型使用透镜读取通过模式匹配多个字段
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