显然有点心不在焉,我写了如下内容:
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE TypeFamilies #-}
class Foo f where
type Bar f :: *
retbar :: Bar f -> IO f
type Baz f = (Foo f, Eq f)
-- WithBar :: * -> (*->Constraint) -> * -> Constraint
type WithBar b c f = (c f, Bar f ~ b)
instance Foo () where
type Bar () = ()
retbar = return
naim :: WithBar () Baz u => IO u -- why can I do this?
naim = retbar ()
main = naim :: IO ()
只有在成功编译之后,我才意识到这实际上不应该Baz
工作:被定义为带有一个参数的类型同义词,但在这里我使用它没有直接参数。Type synonym ‘Baz’ should have 1 argument, but has been given none
当我尝试这样的事情时,通常 GHC 会对我吠叫。
现在,不要误会我的意思:我真的很希望能够写出它,并且很容易看出它在这个特定示例中是如何工作的(简单WithBar
的内联会产生签名naim :: (Foo u, Bar u ~ ()) => IO u
,这当然很好),但是我不明白为什么它在这里实际上是这样工作的。ghc-7.8.2
允许这样做可能只是一个错误吗?