2017-06-03 1 views
4

Aujourd'hui, j'ai essayé de réduire une liste de fonctions à l'aide de la classe de types monoid, mais la fonction résultante attend que son argument soit une instance de Monoid pour une raison quelconque.Comment utiliser une instance monoid d'une fonction?

GHCi me dit que le type de mconcat [id, id, id, id] est Monoid a => a -> a. Pourtant, je m'attendrais à ce que ce soit a -> a.

Que se passe-t-il?

Répondre

8

Vous utilisez cette instance:

instance Monoid b => Monoid (a -> b) where 
    mempty _ = mempty 
    mappend f g x = f x `mappend` g x 

qui est plus générale, car elle ne nécessite pas endomorphismes (à savoir a -> a). Pour obtenir l'instance que vous attendiez, vous pouvez envelopper vos fonctions Endo:

appEndo (mconcat [Endo id, Endo id, Endo id, Endo id]) 

ou

appEndo $ mconcat $ fmap Endo [id, id, id, id] 
+8

Encore une autre solution: 'appEndo $ foldMap Endo [id, id, id, id]' – chi