通过函数组合替换ReaderT和const的类型

时间:2017-09-26 09:45:58

标签: haskell

我想找到它,ReaderTconst的功能组合的类型是什么,并希望自己弄明白。

(.) 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

此时我的大脑停止了。如何继续进行类型替换?

1 个答案:

答案 0 :(得分:3)

ReaderT是一个一元函数:它以(r -> m a)为参数并返回ReaderT r m a作为结果。

(.)的第一个参数也是一元函数b -> c。将ReaderT作为第一个参数自然地传递(r -> m a) ~ bReaderT 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