이 코드 부분의 목적은 elems
의 모든 요소를 계산하는 것보다 size
함수를 더 효율적으로 만드는 것입니다. 목록을 구성하는 두 가지 유형을 합산하여 계산했지만 크기 함수의 서명을 만들 수 없습니다. 서곡에서"Aither a b"유형과 어떻게 일치합니까?
instance (Finite a, Finite b) => Finite (Either a b) where
elems = combineLists [Left x | x <- elems] [Right x | x <-elems]
size ??? = (size a) + (size b)
, 우리는 그 Either a b = Left a | Right b
을 알고있다.
내가 시도한 첫 번째 작업은 Either
과 일치시키는 것이었지만 물론 유형이기 때문에 작동하지 않습니다. 다음으로, 나는 ((Left a) | (Right b))
을 시도했지만 그 중 아무 것도 시도하지 않습니다. 다른 어떤 것도 유형 Either a b
과 일치하지 않습니다.
size (Left a)
을 얻을 수 있었다, 그러나이
b
구성 요소를 실종 이후, 나는 오류가 나타납니다
물론 맥락에서 의미가
Ambiguous type variable `b' in the constraint:
`Finite b' arising from a use of `size' at <interactive>:1:0-12
,하지만 난 정말 어떻게 아무 단서를 일치하는 Either a b
.
아무도 생각이 없습니까?
size (Left x) = size x
size (Right x) = size x
모호한 타입 변수에 대한 오류는 별도의 문제입니다 : 유형 Either a b
의
유형과 생성자의 차이점에 대해 다소 혼란스러워 보입니다. "어느 쪽인가 b"는 두 개의 생성자 인 "Left"와 "Right"가있는 유형입니다. 형식은 형식 시그너처로, 생성자는 코드로 이동합니다. 이것은 "data Foo = Foo Int String"에서와 같이 많은 유형에서 유형 및 생성자에 대해 동일한 이름을 사용하기 때문에 일반적인 혼동입니다. 첫 번째 "Foo"는 유형이고 두 번째는 생성자입니다. –