我写的显然有点心不在焉就像是 https://github.com/leftaroundabout/manifolds/commit/3cef6cd231130fa179a1812df7f07e8c53bff3ff#diff-e59c0103479c9d73acd7de529c84ec36R431下列:
{-# 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
被定义为带有一个参数的类型同义词,但在这里我在没有直接参数的情况下使用它。通常 GHC 对我吠叫Type synonym ‘Baz’ should have 1 argument, but has been given none
当我尝试类似的事情时。
现在,不要误会我的意思:我真的很希望能够编写它,并且很容易看到它在这个特定示例中如何工作(简单地内联WithBar
会产生签名naim :: (Foo u, Bar u ~ ()) => IO u
,这当然没问题),但我不明白为什么它实际上就像这里一样工作。这也许只是一个错误ghc-7.8.2
允许这样做吗?
您的文件在 GHC 7.8 中编译,但在 GHC 7.10 中出现错误:
类型同义词“Baz”应该有 1 个参数,但没有给出任何参数
在“naim”的类型签名中: naim :: WithBar () Baz u => IO u
Adding -XLiberalTypeSynonyms
修复错误。因此,这是7.8中的一个错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)