4
今天我试图减少函数列表通过monoid typeclass,但由此产生的函数期望它的参数是一个Monoid的实例。如何使用函数的monoid实例?
GHCI告诉我,mconcat [id, id, id, id]
的类型是Monoid a => a -> a
。但我希望它是a -> a
。
发生了什么事?
今天我试图减少函数列表通过monoid typeclass,但由此产生的函数期望它的参数是一个Monoid的实例。如何使用函数的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]
另一种替代方案:'appEndo $ foldMap远藤[ID,ID,ID,ID]' – chi