什么时候(如果有的话)可以部分应用类型同义词?

2023-12-21

我写的显然有点心不在焉就像是 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(使用前将#替换为@)

什么时候(如果有的话)可以部分应用类型同义词? 的相关文章

随机推荐