Renfield:我如何让这次遍历工作?

时间:2017-03-24 23:08:14

标签: haskell traversal lenses

我有一些嵌套记录(缩减为相关字段)。

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 

那么我该如何进行这种遍历呢?

1 个答案:

答案 0 :(得分:2)

来自freenode上的glguy:

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