【发布时间】:2011-08-28 21:34:52
【问题描述】:
我很困惑为什么这段代码可以使用类型提示进行编译,但没有就无法编译。不应有任何实例歧义(只有一个实例)。
class Monad m => FcnDef β m | β -> m where
def :: String -> β -- takes a name
instance Monad m => FcnDef (m α -> m α) m where
def s body = body
dummyTest :: forall m. Monad m => m ()
dummyTest = def "dummy" ((return ()) :: m ())
另一方面,如果省略:: m () 或所有类型声明,编译将失败并出现此错误,
No instance for (FcnDef (m0 () -> t0) m0)
arising from a use of `def'
为了澄清,代码试图为def创建一个多变量类型,所以可以写例如
def "dummy2" "input" $ \in -> return ()
编辑
这个问题比没有单态限制的问题更有趣。如果添加这样的代码,则将实例解析为具体类型,即
dummyTest = def "dummy" (return ())
g :: IO ()
g = dummyTest
编译同样失败。
【问题讨论】:
-
我还没有理解整个问题,但是实例的数量不会有什么不同。实例推断对于可能的未来实例是防御性的。看起来您的实例头有两次相同的 var。除非有其他因素迫使这些类型相同,否则它不会触发。
标签: haskell type-inference ghc typeclass