如何使用函数的单体实例



今天,我试图减少功能列表honoid Typeclass,但结果函数期望其参数由于某种原因而成为MONOID的实例。

GHCI告诉我mconcat [id, id, id, id]的类型是Monoid a => a -> a。但是我希望它是a -> a

发生了什么事?

您正在使用此实例:

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

这是更通用的,因为它不需要内态性(即a -> a(。为了获得您期望的实例,您可以将功能包装在Endo

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

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