실제 세계 하스켈이 예제가 있습니다GHC는 클래스 인스턴스가 루프인지 경고 할 수 있습니까?
class BasicEq3 a where
isEqual3 :: a -> a -> Bool
isEqual3 x y = not (isNotEqual3 x y)
isNotEqual3 :: a -> a -> Bool
isNotEqual3 x y = not (isEqual3 x y)
instance BasicEq3 Bool
을 내가 GHCI에서 실행할 때
#> isEqual3 False False
out of memory
을 그래서, 당신은 두 가지 방법 중 하나 이상을 구현해야하거나 루프 것이다. 그리고 당신은 깔끔한 것을 선택할 수있는 융통성을 얻습니다.
내가 갖고있는 질문은 기본 설정을 충분히 오버라이드하지 않았고 기본값이 루프를 형성하면 경고 또는 무언가를 얻을 수있는 방법이 있습니까? 나에게는 이상하게 보입니다.이 예제에서는 매우 똑똑한 컴파일러가 괜찮습니다.
예! 중지 문제의 경우, Agda와 같은 전체 언어는 일반적으로 해결할 수없는 문제가 크고 흥미로운 해결할 수있는 부분 집합을 가질 수 있음을 증명합니다. –
"간단히 말해서 결정할 수없는 것"은 컴파일러 기술을 부인할 수있는 기준이 아닙니다. 일반적인 경우 결정 불가능한 대부분의 문제는 특정 경우에 결정할 수 있습니다. " http://c2.com/cgi/wiki?SufficientlySmartCompiler –
trac 티켓이 말도 안되는 이유로 닫혔습니다 : 누군가가'-' 또는'negate'없이'Num' 인스턴스를 정의 할 수 있지만'+'는 평가하지 않습니다 그것의 명백하게 원형 정의가 잘 끝날 것입니다. 이 always-discarding-second-argument는'-' 또는'negate'를 정의하지 않고 비 종료에서 벗어날 수있는 유일한 방법입니다. 제 생각에는 이런 것들이 유용하다고 생각합니다. 그리고'-noarnundefinedcyclicmethods'를 지정해야 괜찮습니다.'_'을 사용하여 순환 정의를 벗어나고 싶다면. 나는 _no idea_ 어떻게 trac에 인상을 가지고있다. – AndrewC