Renfield:如何让这种遍历工作?
Renfield: How Do I Get This Traversal To Work?
我有一些嵌套记录(减少到相关字段)。
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
这个版本做了我想要的,但不是我想要的方式。我想使用 Lenses
和 Traversals
.
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
那么如何进行遍历呢?
来自 freenode 上的 glguy:
getScore :: GameS -> [(Text,GhoulCount)]
getScore gs =
itoListOf (game_data_gs . players_gd . p_map . ifolded <. score) gs
我有一些嵌套记录(减少到相关字段)。
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
这个版本做了我想要的,但不是我想要的方式。我想使用 Lenses
和 Traversals
.
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
那么如何进行遍历呢?
来自 freenode 上的 glguy:
getScore :: GameS -> [(Text,GhoulCount)]
getScore gs =
itoListOf (game_data_gs . players_gd . p_map . ifolded <. score) gs