(这是Typeclassopedia中的一个练习。)
如何计算两个非平凡函数的组合类型,例如foldMap . foldMap
?
对于简单的情况,这很容易:只需查看类型(.)
(.) :: (b -> c) -> (a -> b) -> (a -> c)
并找到类型a
,b
和c
两个函数。
在 的情况下foldMap
,类型是
foldMap :: (Foldable t, Monoid m) => (a -> m) -> t a -> m
我看不出有什么办法可以将这个函数的类型“拆分”成两部分,这样我就可以得到一个“a”、“b”和“c”,就像 for 的类型一样(.)
。
然后我要求ghci
计算它的类型。它通过以下类型成功:
Prelude Data.Foldable> :t foldMap . foldMap
foldMap . foldMap
:: (Foldable t, Foldable t1, Data.Monoid.Monoid m) =>
(a -> m) -> t (t1 a) -> m
如何从foldMap
and(.)
的类型派生该类型?我特别困惑的是,在's 类型中t (t1 a)
找不到的“新”类型如何出现在 for 类型中。foldMap
foldMap . foldMap