가능한 중복 :
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
중 적어도 하나을 지정할 필요가 있음을 알게하는 방법이 있나요?
관련 : [클래스 인스턴스가 루프인지 여부를 ghc 경고 할 수 있습니까?] (http://stackoverflow.com/questions/12270239/can-ghc-warn-if-class-instance-is-a-loop) – AndrewC
@ 고마워. 나는 중복으로 투표하기로 결심했지만, 내 질문에는 미묘한 차이가 있다고 생각한다. 컴파일러가 항상 상호 재귀 적 기본값에 대해 불평하지 않기를 바란다. 특정 수업에 불만을 표시합니다. –
컴파일러에게 상호 재귀가 유용하지 않고 순환 적이라는 것을 알아내는 것이 많은 도움을 얻고 있기 때문에 필자는 인간의 명세에 맞는 가치가 있다고 생각합니다. 아마도 인스턴스가 (지정하기 어렵거나 퍼져 나갈 때), 또는 아마도 더 나은 경우 대체 최소 사양 목록을 만들 때 적어도 한 세트 (두 세트)의 함수 세트가 재정의된다는 경고를하는 플러그 - 마가있을 것입니다 하나의 큰 pragma 한 장소에서 - 더). 나는 [trac 티켓] (http://hackage.haskell.org/trac/ghc/ticket/6028)을 자세히 읽지 않았다. – AndrewC