Pra*_*eek 17 haskell instance typeclass type-signature
我喜欢在我的代码中为所有顶级定义添加类型签名.但是,实例声明中的类型签名似乎不被允许,如果我放置一个,我会从GHC获得"错位类型签名"错误.为什么会这样?为什么GHC不能检查类型签名是否与预期相同,如果不是,则拒绝(或警告)?
hug*_*omg 12
如果您真的需要类型声明,则可以在实例主体外单独创建函数.
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 = ...
Run Code Online (Sandbox Code Playgroud)
这里的大多数其他答案都很古老......现在有一种语言扩展:
在文件顶部粘贴以下内容:
{-# Language InstanceSigs #-}
Run Code Online (Sandbox Code Playgroud)
由于签名是类定义的一部分,因此实例声明中的类型签名将是重复的签名。我认为原则上允许重复签名没有问题,但是通常允许重复签名没有任何好处,并且禁止重复签名更简单。因此,语言定义说每个实体最多只能有一个类型签名。在实例声明中也允许签名的功能并没有被要求太多,因此没有扩展允许它。如果确实需要,可以在GHC trac上提出功能请求。如果它引起足够的兴趣,它可能会实现(但我不期望需求很高)。