내가 만든 데이터 형식에 대한 인스턴스 선언을 수행 할 때 형식 컨텍스트를 사용했습니다.Haskell Type 함수에서 필요한 인스턴스 선언의 컨텍스트
data Set a = Insert a (Set a) | EmptySet
instance (Show a) => Show (Set a) where
show x = "{" ++ show' x ++ "}" where
show' (Insert x EmptySet) = show x
show' (Insert x xs) = show x ++ ", " ++ show' xs
instance Eq a => Eq (Set a) where
(Insert x xs) == (Insert y ys) = (x == y) && (xs == ys)
은 그래서 지금, 나는 그과 같이, 내 설정 유형을 사용 정의하는 모든 기능에 EQ 형식 컨텍스트를 추가 할 필요가, 또는 내가 유형 오류 얻을 :
memberSet::Eq a =>a->Set a->Bool
memberSet _ EmptySet = False
memberSet x (Insert y ys)
| x == y = True
| otherwise = memberSet x ys
subSet::Eq a=>Set a->Set a->Bool
subSet EmptySet _ = True
subSet (Insert a as) bs
| memberSet a bs = subSet as bs
| otherwise = False
오류를 나는 다음과 같이 보입니다.
No instance for (Eq a)
arising from a use of `=='
In the expression: (x == y)
In a stmt of a pattern guard for
an equation for `memberSet':
(x == y)
In an equation for `memberSet':
memberSet x (Insert y ys)
| (x == y) = True
| otherwise = memberSet x ys
Failed, modules loaded: none.
이게 무슨 뜻입니까? 이 오류가 발생하는 이유는 무엇입니까? 인스턴스 선언을하면 하스켈은 내 함수 "memberSet"과 "subSet"에서 "=="로 비교되는 것들이 자동으로 "Eq?"의 인스턴스로 체크 될 것인가를 자동으로 확인할 수있을 것이라고 생각했다. 선명도
편집 :
내 문제는 내가 유형 컨텍스트는 "memberSet"과에 필요한 이유를 이해하지 못하는 것입니다 "의 subSet." 그렇게 제거하면 컴파일되지 않습니다. 인스턴스 선언의 말씀
memberSet::a->Set a->Bool
memberSet _ EmptySet = False
memberSet x (Insert y ys)
| x == y = True
| otherwise = memberSet x ys
subSet::Set a->Set a->Bool
subSet EmptySet _ = True
subSet (Insert a as) bs
| memberSet a bs = subSet as bs
| otherwise = False
코드는 나를 위해 typechecks를 제공합니다.너 뭐하니? – bdonlan
코드가 주어진 것처럼 보이기 때문에 범위 또는 이름과 관련된 일종의 미묘한 오류가 의심됩니다. –
내 질문에 불분명 함. 코드가 컴파일됩니다. 왜 "구성원 집합"과 "하위 집합"에 대한 형식 컨텍스트로 편집하지 않을지 궁금합니다. –