2012-10-31 1 views
2

Можно создать дубликат:
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?

+1

релевантно: [Может ли ghc предупредить, если экземпляр класса является циклом?] (Http://stackoverflow.com/questions/12270239/can-ghc-warn-if-class-instance-is-a-loop) – AndrewC

+0

@ AndrewC Спасибо. Я проголосовал за то, чтобы закрыть как дубликат, но я думаю, что в моем вопросе есть тонкая разница - я не хочу, чтобы компилятор всегда * жаловался на взаимно рекурсивные значения по умолчанию, но я * хочу * хочу, чтобы он сказал это жалуются на определенные классы. –

+0

Я думаю, что это достойная человеческая спецификация, да, так как просить компилятор указать, где взаимная рекурсия круглая, а не полезная, задает много вопросов! Возможно, прагма просит его предупредить, что хотя бы один (иногда два) набора функций переопределяется, когда вы делаете экземпляр (трудно указать, распространять) или, возможно, лучше, список альтернативных минимальных спецификаций (может быть в одна большая прагма в одном месте - лучше). Я не читал [trac ticket] (http://hackage.haskell.org/trac/ghc/ticket/6028) близко. – AndrewC

ответ

5

К сожалению, нет. Большинство библиотек, которые определяют классы типов со значениями по умолчанию, будут указывать «минимальное полное определение», но они не указывают, что для GHC можно проверить прямо сейчас. Там были некоторые неопределенные разговоры о реализации прагмы для этого, но ничего серьезного, насколько я знаю.

Обратите внимание, что проверки взаимной рекурсии недостаточно; взаимно рекурсивные методы по умолчанию могут быть совершенно правильными, например. some и many в Alternative.

Смежные вопросы