为什么:t foldMap id yield t m - > m,而不是t - >米

时间:2016-03-20 13:53:55

标签: haskell

foldMap具有以下类型:

foldMap :: (Foldable t, Monoid m) => (a -> m) -> t a -> m

如果您将id部分应用于foldMap,则

foldMap id :: (Foldable t, Monoid m) => t m -> m

为什么t a在应用t m时会更改为id

2 个答案:

答案 0 :(得分:5)

id属于x -> x类型,这意味着当foldMap将其作为参数时,a会被限制为与m相同的类型。调用此新类型n。由于a是一个自由类型变量,因此我们对n的唯一约束来自m,即n是一个幺半群。

由于(Foldable t, Monoid n) => t n -> n上的应用程序导致删除初始n -> n后,会生成类型签名id。这是您观察到的类型签名(在n再次简单重新标记为m之后,因为类型变量名称是任意的。)

答案 1 :(得分:4)

a对此没有限制,但m必须是幺半群。由于id必须返回一个幺半群,因此它也必须将一个幺半群作为参数,这意味着Foldable必须包含一个幺半群。

也就是说,您只能foldMap id函数Foldable超过由{1}组成的幺正值。