特别是,我的问题是如何认为这与f本身相同?
我们知道return
的类型是:: a -> m a
,>=>
的类型是:: (a -> m b) -> (b -> m c) -> (a -> m c)
所以当我们将>=>
应用于{{ 1}}和f,不会出现类型不匹配,因为我们不会return
分别为(a -> m a) -> (b -> m c)
和f的类型,这意味着我们怎样才能应用{{1}现在?
答案 0 :(得分:8)
让我们重命名一些类型变量以避免混淆:
return :: a -> m a
(>=>) :: (b -> m c) -> (c -> m d) -> (b -> m d)
当我们申请(>=>) return
时,我们需要制作
(a -> m a) = (b -> m c)
(return
的类型和>=>
的第一个参数的类型)。
因此我们有
a = b
a = c
(因此b = c
也是如此。)
然后
(>=>) return :: (c -> m d) -> (b -> m d)
a = b
a = c
是
(>=>) return :: (a -> m d) -> (a -> m d)
因此,只要f :: a -> m d
,我们就可以将(>=>) return
应用于f
并获得相同类型的值。