Chr*_*lor 2 haskell types typeclass
可能重复:
如果类实例是一个循环,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
Run Code Online (Sandbox Code Playgroud)
根据不同的类型,它可能是更容易实现bar或baz,或者你可能想给他们两人的实现出于效率的考虑.
现在我去别的地方做一个这个类的实例
instance Foo Integer where
foo = 1
Run Code Online (Sandbox Code Playgroud)
哎呀,我忘了执行任何的bar或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.
Run Code Online (Sandbox Code Playgroud)
嗯,显然不是.现在,如果我尝试使用我的课程
*Main> bar 1
<interactive>: out of memory
Run Code Online (Sandbox Code Playgroud)
哦,哦.提示痛苦的调试时间.
有没有办法让GHC知道,每个实例都需要指定至少一个的bar还是baz?
不幸的是.大多数使用默认值定义类型类的库将指定"最小完整定义",但它们现在不以可检查的方式指定GHC.关于为此实施一个pragma,有一些模糊的说法,但据我所知,并没有什么严重的.
请注意,仅检查相互递归是不够的; 相互递归默认的方法可能是完全有效的,如some和many在Alternative.