Можно создать дубликат:
Can GHC warn if class instance is a loop?избежать ошибка с взаимно рекурсивных методов по умолчанию в классах типа
Рассмотрим тип класса с двумя методами, которые реализуемо с точки зрения друг друга:
class Num a => Foo a where
foo :: a
bar :: a -> a
bar x = baz x + 1
baz :: a -> a
baz x = bar x - 1
В зависимости от типа его может быть проще реализовать bar
или baz
, или вы можете дать реализацию обоих из них по соображениям эффективности.
Теперь я иду куда-нибудь и сделать экземпляр этого класса
instance Foo Integer where
foo = 1
К сожалению, я забыл реализовать либо из 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.
Хм, очевидно, нет. Теперь, если я попытаюсь использовать мой класс
*Main> bar 1
<interactive>: out of memory
Uh oh. Cue часы болезненной отладки.
Есть ли способ, чтобы GHC знать, что каждый экземпляр должен указать по крайней мере, один изbar
или baz
?
релевантно: [Может ли ghc предупредить, если экземпляр класса является циклом?] (Http://stackoverflow.com/questions/12270239/can-ghc-warn-if-class-instance-is-a-loop) – AndrewC
@ AndrewC Спасибо. Я проголосовал за то, чтобы закрыть как дубликат, но я думаю, что в моем вопросе есть тонкая разница - я не хочу, чтобы компилятор всегда * жаловался на взаимно рекурсивные значения по умолчанию, но я * хочу * хочу, чтобы он сказал это жалуются на определенные классы. –
Я думаю, что это достойная человеческая спецификация, да, так как просить компилятор указать, где взаимная рекурсия круглая, а не полезная, задает много вопросов! Возможно, прагма просит его предупредить, что хотя бы один (иногда два) набора функций переопределяется, когда вы делаете экземпляр (трудно указать, распространять) или, возможно, лучше, список альтернативных минимальных спецификаций (может быть в одна большая прагма в одном месте - лучше). Я не читал [trac ticket] (http://hackage.haskell.org/trac/ghc/ticket/6028) близко. – AndrewC