今天,我试图减少功能列表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]