2

可能重复:
如果类实例是循环,GHC 可以警告吗?

考虑一个类型类,它有两个可以相互实现的方法:

class Num a => Foo a where

  foo :: a

  bar :: a -> a
  bar x = baz x + 1

  baz :: a -> a
  baz x = bar x - 1

根据类型,实现baror可能更容易baz,或者出于效率原因,您可能希望同时实现它们。

现在我去别的地方做这个类的一个实例

instance Foo Integer where
  foo = 1

糟糕,我忘实现baror baz!没关系,类型系统会为我选择,不是吗?

C:\path\to\file> ghci Foo.hs
GHCi, version 7.4.1: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
[1 of 1] Compiling Main             ( Foo.hs, interpreted )
Ok, modules loaded: Main.

嗯,显然不是。现在,如果我尝试使用我的课程

*Main> bar 1
<interactive>: out of memory

哦哦。提示数小时的痛苦调试。

有没有办法让 GHC 知道每个实例至少需要指定一个baror baz

4

1 回答 1

5

不幸的是没有。大多数使用默认值定义类型类的库都会指定“最小完整定义”,但他们现在没有以可检查的方式将其指定给 GHC。有一些关于为此实施 pragma 的模糊讨论,但据我所知,没有什么严重的。

请注意,仅检查相互递归是不够的;相互递归的默认方法可能是完全有效的,some例如manyAlternative.

于 2012-10-31T09:02:37.837 回答