我想找到它,ReaderT
和const
的功能组合的类型是什么,并希望自己弄明白。
(.) ReaderT const :: ???
首先,查看ReaderT
和(.)
的类型签名:
ReaderT :: (r -> m a) -> ReaderT r m a
(.) :: (b -> c) -> (a -> b) -> a -> c
然后我做了以下替换:
(.) ReaderT
一步一步:
((r -> m a) -> ReaderT r m a) -> (a1 -> (r -> m a)) -> a1 -> ReaderT r m a
它成为:
(a1 -> r -> m a) -> a1 -> ReaderT r m a
下一个替换为const
:
const :: (a -> ( b -> a ))
(a1 -> ( r -> m a)) -> a1 -> ReaderT r m a
此时我的大脑停止了。如何继续进行类型替换?
答案 0 :(得分:3)
ReaderT
是一个一元函数:它以(r -> m a)
为参数并返回ReaderT r m a
作为结果。
(.)
的第一个参数也是一元函数b -> c
。将ReaderT
作为第一个参数自然地传递(r -> m a) ~ b
和ReaderT r m a ~ c
:
(r -> m a) -> ReaderT r m a
b -> c
因此,将其替换为(.)
类型,我们得到
> :t (.) ReaderT
(.) ReaderT :: (a -> r -> m a1) -> a -> ReaderT r m a1
(.)
传递了第一个参数为2,所以现在它是一个一元函数(粗略地说,(a -> b) -> a -> c
的{{1}}部分),其中(b -> c) -> (a -> b) -> a -> c
和{ {1}}固定在我们上面写的内容中。
现在,b
,一个二元函数,正好是c
下一个期望:
const :: a -> b -> a
这意味着由(.) ReaderT
类型(a -> r -> m a1)
a -> b -> a
引起的a ~ m a1
变为a
。
所以,我们将两个参数都传递给了(.)
,它给了我们m a
(.)
(注意这些是不同的!)和a -> c
。