2017-03-24 2 views
2

J'ai quelques enregistrements imbriqués (réduits aux champs pertinents).Renfield: Comment faire pour que cette traversée fonctionne?

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 } 

Je suis en train de créer une fonction de ce type

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

ici est une tentative, me donne une fonction de type

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

Cette version fait ce que je veux, mais pas comme je le veux. Je voudrais utiliser Lenses et 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 

Comment faire pour que cette traversée fonctionne?

Répondre

2

De glguy sur freenode:

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