친애하는 하스켈/GHC 전문가 하나,하스켈/GHC : 컨텍스트 만 허용 동안보고 된 인스턴스를 겹쳐 하나의
하나 실제로 제공 상황에 따라 유효한 동안 GHC 겹치는 경우를보고 왜 난 정말 이해가 안 돼요. 예를 들어, 다음 코드 조각을 살펴 보자 :
{-# LANGUAGE FlexibleInstances #-}
class C a where
foo :: a -> String
foo x = "OK"
instance C Bool
instance (C a) => C [a]
instance (C a) => C [(Char, a)]
main = print $ foo [('a', True)]
그것을주는 컴파일 :
Test.hs:13:16: error:
* Overlapping instances for C [(Char, Bool)]
arising from a use of `foo'
Matching instances:
instance C a => C [a] -- Defined at Test.hs:9:10
instance C a => C [(Char, a)] -- Defined at Test.hs:11:10
* In the second argument of `($)', namely `foo [('a', True)]'
In the expression: print $ foo [('a', True)]
In an equation for `main': main = print $ foo [('a', True)]
점은 ('a', True)
이 C
의 인스턴스가 아닌 어떤 (Char, Bool)
을 입력 가지고 있다는 것입니다. 따라서 [('a', True)]
값에는 instance C a => C [a]
을 적용 할 수 없습니다.
따라서 GHC는 왜 그것을 고려합니까?
문제는 실제로 문제를 피하는 방법 (예 : OverlappingInstances
사용)이 아니라 GHC의 행동을 이해하는 것입니다. 함수 호출을 "해석"할 때 컨텍스트가 사용되지 않기 때문입니까? 그렇다면 왜?
미리 감사드립니다.
감사합니다. 슈리. 그래서 기본적으로 이것은 (비표준) 확장에서 "GHC가 작동하는 방식"처럼 보입니다. 나는 그 질문을 닫는다. –