以下代码编译:
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
放在读者中,这样我就不必传递它。这是一个问题吗?
答案 0 :(得分:3)
没什么不对的。类型检查器 确定了f2
的类型 - 再次查看ghci的输出:
ghci> :t f2
f2 :: t
t
是forall 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 ()
。