2017-03-24 37 views
2

我有一些嵌套的记录(简化到相关字段)。Renfield:我如何使这个遍历工作?

data GameS  = GameS { _game_data_gs :: GameData } 
data GameData = GameData { _players_gd :: PlayerMap } 
data PlayerMap = PlayerMap { _p_map :: Map PlayerName Player } 
data Player = Player { _score :: GhoulCount } 

我试图创建一个功能与这种类型的

playerScores :: GameS -> [(PlayerName, GhoulCount)] 

这里是一个尝试,让我型

playerScores :: GameS -> [GhoulCount] 
playerScores gs = 
    toListOf (game_data_gs . players_gd . p_map . traverse . score) gs 

这个版本我想要做什么的功能,但不是我想要的方式。我想使用LensesTraversals

playerScores :: GameS -> [(PlayerName,GhoulCount)] 
playerScores gs = 
    Data.Map.Strict.toList      $ 
    Data.Map.Strict mapWithKey (\_ v -> _score v) $ 
    view (game_data_gs . players_gd . p_map) gs 

那么我该如何做这个遍历工作?

回答

2

从glguy freenode上:

getScore :: GameS -> [(Text,GhoulCount)] 
getScore gs = 
    itoListOf (game_data_gs . players_gd . p_map . ifolded <. score) gs