GHC无法推断出来自`ReaderT(Proxy p)IO()`的函数类型

时间:2016-05-29 19:38:21

标签: haskell type-inference

以下代码编译:

import Control.Monad.Trans.Reader
import Data.Proxy

f1 :: ReaderT (Proxy p) IO ()
f1 = f2

f2 = undefined

GHC知道f1的类型:

> :t f1
f1 :: ReaderT (Proxy p) IO ()

但它无法找出f2的类型:

> :t f2
f2 :: t

出了什么问题?

我的想法是将Proxy放在读者中,这样我就不必传递它。这是一个问题吗?

1 个答案:

答案 0 :(得分:3)

没什么不对的。类型检查器 确定了f2的类型 - 再次查看ghci的输出:

ghci> :t f2
f2 :: t

tforall t. t的简写。 f2可以采用任何类型。这是有道理的 - 毕竟f2 = undefined

ghci> :t undefined
undefined :: a

当您撰写f1 = f2时,您在更具体的f2类型上使用ReaderT (Proxy p) IO ()ReaderT (Proxy p) IO ()是实例化类型t的一种方法。换句话说,类型推断算法已经生成了简单的统一约束t ~ ReaderT (Proxy p) IO ()