J'essaie d'implémenter un cache transparent qui peut charger un objet spécifique lorsqu'il n'est pas disponible ou retourner un objet déjà existant indexé par (name
).Implémentation d'un cache
J'ai essayé de courir ceci:
loader' objs name = case findObj objs name of
Nothing → (new_obj, loader' new_objs)
Just obj → (obj, loader' objs)
where
new_objs = [(name, new_obj)] ++ objs
new_obj = readObj name
loader = loader' []
mais je reçois un
Occurs check: cannot construct the infinite type: t = (ObjType, String -> t)
qui ressemble exactement à ce que je veux :)
Comment puis-je fixer la fonction pour qu'il compile?
Clarifications:
Comme demandé, les signatures (findObj renvoie soit une valeur connue trouvée via une clé, ou rien, readObj crée une nouvelle obj pour une clé):
findObj :: [(String, ObjType)] -> String -> Maybe ObjType
readObj :: String -> ObjType
Et oui - je besoin d'un cache, car les clés sont des noms de fichiers et je ne veux pas lire + analyser le fichier chaque fois qu'un objet est nécessaire.
Je pense que nous aurons besoin de voir les définitions de findObj et readObj –
Avez-vous même besoin du concept d'un cache dans un langage fonctionnel? J'ai toujours pensé que ce serait une optimisation impérative. – Pyrolistical
ajouté des signatures pour findObj, readObj – viraptor