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
?
答案 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}组成的幺正值。