2016-05-29 40 views
1

下面的代码编译:GHC不能推断的功能类型从名为`ReaderT(代理p)的IO()`

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

但它可以” t找出类型f2

> :t f2 
f2 :: t 

怎么了?

我的想法是将Proxy放入阅读器中,这样我就不必传递它。不知怎的,这是一个问题吗?

+0

'f2'的类型是'forall t。 (''forall'是隐含的,所以当GHCi打印时它被省略)。这是'undefined'的类型。 'f2'的类型不能被它的使用方式所限制。如果这种事情发生了,如果你使用'id'a'',你就不能在非'Char'类型上使用'id'。 –

回答

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

+0

感谢您的解释,但它并没有让我更接近我想要的东西。我想我误解了我的实际问题。我要发布另一个。 – rityzmon