为什么不能在Haskell中的实例声明中放置类型签名?

时间:2011-12-03 11:48:24

标签: haskell instance typeclass type-signature

我喜欢在我的代码中为所有顶级定义添加类型签名。但是,实例声明中的类型签名似乎不被允许,如果我放置一个,我会从GHC获得“错位类型签名”错误。为什么会这样?为什么GHC不能检查类型签名是否与预期相同,如果不是,则拒绝(或警告)?

5 个答案:

答案 0 :(得分:13)

您可以使用[new] -XInstanceSigs为实例添加类型签名,这对于在范围内引入类型变量特别有用。您可以在official docs

中找到更多信息

答案 1 :(得分:10)

如果确实想要类型声明,则可以在实例主体外单独创建函数。

class Class a where
    f1 :: a -> a

instance Class Foo where
    f1 = foo_f1

--monomorphic version of f1 for Foo:
foo_f1 :: Foo -> Foo
foo_f1 = ...

答案 2 :(得分:5)

这里的大多数其他答案都很古老......现在有一种语言扩展:

将以下内容贴在文件的顶部:

{-# Language InstanceSigs #-}

答案 3 :(得分:4)

由于签名是类定义的一部分,因此实例声明中的类型签名将是重复签名。我认为原则上不允许重复签名存在问题,但通常允许它们没有优势,并且不允许它们更简单。所以语言定义说每个实体最多只能有一个类型签名。在实例声明中允许签名的功能还没有被要求太多,因此没有允许它的扩展。如果您真的想要,可以在GHC trac上提出功能请求。如果它获得足够的兴趣,它可能会实现(但我不认为需求很高)。

答案 4 :(得分:2)

在任何情况下,类型都是多余的,通常希望避免冗余。 在Frege中,仍允许为实例成员编写类型签名。他们被检查然后扔掉。当然更容易立即禁止它们。