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