2012-10-31 3 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 

어 오. 고통스러운 디버깅을위한 큐 시간.

GHC는 각 인스턴스 bar 또는 baz 중 적어도 하나을 지정할 필요가 있음을 알게하는 방법이 있나요?

+1

관련 : [클래스 인스턴스가 루프인지 여부를 ghc 경고 할 수 있습니까?] (http://stackoverflow.com/questions/12270239/can-ghc-warn-if-class-instance-is-a-loop) – AndrewC

+0

@ 고마워. 나는 중복으로 투표하기로 결심했지만, 내 질문에는 미묘한 차이가 있다고 생각한다. 컴파일러가 항상 상호 재귀 적 기본값에 대해 불평하지 않기를 바란다. 특정 수업에 불만을 표시합니다. –

+0

컴파일러에게 상호 재귀가 유용하지 않고 순환 적이라는 것을 알아내는 것이 많은 도움을 얻고 있기 때문에 필자는 인간의 명세에 맞는 가치가 있다고 생각합니다. 아마도 인스턴스가 (지정하기 어렵거나 퍼져 나갈 때), 또는 아마도 더 나은 경우 대체 최소 사양 목록을 만들 때 적어도 한 세트 (두 세트)의 함수 세트가 재정의된다는 경고를하는 플러그 - 마가있을 것입니다 하나의 큰 pragma 한 장소에서 - 더). 나는 [trac 티켓] (http://hackage.haskell.org/trac/ghc/ticket/6028)을 자세히 읽지 않았다. – AndrewC

답변

5

불행히도. 디폴트를 가진 타입 클래스를 정의하는 대부분의 라이브러리는 "최소한의 완전한 정의"를 지정할 것입니다.하지만 그들은 GHC에 체크 가능한 방식으로 지정하지 않습니다. 이것에 대한 플러그 - 마 구현에 대한 모호한 이야기가 있지만, 내가 아는 한 진지한 것은 없습니다.

상호 재귀 만 확인하는 것만으로는 충분하지 않습니다. 상호 재귀 적 기본 메소드는 완벽하게 유효 할 수 있습니다. somemanyAlternative입니다.