Mon contexte est la bioinformatique, le séquençage de nouvelle génération en particulier, mais le problème est générique; donc je vais utiliser un fichier journal comme exemple.Haskell: Puis-je effectuer plusieurs plis sur la même liste paresseuse sans garder de liste en mémoire?
Le fichier est très volumineux (Gigaoctets grand, comprimé, de sorte qu'il ne rentre pas dans la mémoire), mais est facile à analyser (chaque ligne est une entrée), donc on peut facilement écrire quelque chose comme:
parse :: Lazy.ByteString -> [LogEntry]
Maintenant, j'ai beaucoup de statistiques que je voudrais calculer à partir du fichier journal. Il est plus facile d'écrire des fonctions distinctes, telles que:
totalEntries = length
nrBots = sum . map fromEnum . map isBotEntry
averageTimeOfDay = histogram . map extractHour
Tous ces éléments sont de la forme foldl' k z . map f
.
Le problème est que si comme
main = do
input <- Lazy.readFile "input.txt"
let logEntries = parse input
totalEntries' = totalEntries logEntries
nrBots' = nrBots logEntries
avgTOD = averageTimeOfDay logEntries
print totalEntries'
print nrBots'
print avgTOD
Cette répartira toute la liste en mémoire, je tente de les utiliser de la manière la plus naturelle, ce qui est pas ce que je veux. Je veux que les plis soient faits de manière synchrone, de sorte que les cellules puissent être récupérées. Si je ne calcule qu'une seule statistique, c'est ce qui se passe.
Je peux écrire une seule grande fonction qui fait cela, mais c'est un code non-composable.
Sinon, ce que j'ai fait, je lance chaque passe séparément, mais cette recharge & décompresse le fichier à chaque fois.
Pourquoi ne vous fait pas 'logAnalysers :: [(K, Z, F)]'Où 'K, Z, F' sont les types de fonctions' k, z, f' dans votre exemple? Ensuite, il devient un code "composable", d'une certaine manière, si vous avez un seul pli qui utilise la liste. – dflemstr
@dflemstr les types intermédiaires ne sont pas toujours les mêmes :( – luispedro
Vous * pourriez * faire 'logAnalysers :: [forall abc. (B -> c -> b, c, a -> b)]', ce qui permettrait différents types ... – dflemstr