2013-06-17 2 views
4

I ont actuellement définis deux fonctions:Comment soulever une fonction pour travailler sur des lentilles?

avg :: (Fractional e) => [e] -> e 
avg e = uncurry (/) $ foldl' (\(a,l) v -> (a+v,l+1)) (0.0,0.0) e 

avgOf :: (Fractional a) => Getting (Endo (Endo (a, a))) s a -> s -> a 
avgOf g s = uncurry (/) $ foldlOf' g accfun (0.0,0.0) s 
    where accfun (a,l) v = (a+v, l+1) 

Je suis sous l'impression qu'il doit y avoir un moyen facile de se débarrasser de toute mise en œuvre avgOf et le remplacer par un simple que juste « ascenseurs » avg travailler sur des lentilles.

+2

Je pense que la solution évidente serait avgOf l = avg. toListOf l – Taneb

+0

Si cela fonctionne, c'est certainement la chose la plus facile à faire. Pourriez-vous afficher cela comme une réponse? – fho

+0

Cela fonctionne. Mais vous devez également donner l'autre paramètre. – fho

Répondre

3

Vous pouvez utiliser partsOf pour construire ceci en tissu entier.

avgOf l xs = xs^..partsOf l.to avg 
Questions connexes