2010-02-22 2 views
11

이 코드 부분의 목적은 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

+1

유형과 생성자의 차이점에 대해 다소 혼란스러워 보입니다. "어느 쪽인가 b"는 두 개의 생성자 인 "Left"와 "Right"가있는 유형입니다. 형식은 형식 시그너처로, 생성자는 코드로 이동합니다. 이것은 "data Foo = Foo Int String"에서와 같이 많은 유형에서 유형 및 생성자에 대해 동일한 이름을 사용하기 때문에 일반적인 혼동입니다. 첫 번째 "Foo"는 유형이고 두 번째는 생성자입니다. –

답변

25

뭔가 별도로 처리 할 수있는 두 개의 사례를 가지고, 그래서 중 하나 Left a 또는 Right b이다. size (Left 1)과 같은 것을 해석기에 입력하면 시스템은 Left 1 값의 "올바른"유형이 무엇인지 추론 할 수 없습니다. Either Int anything 일 수 있으며 어떤 유형이 anything인지 알 수없는 한, 해당 번호가 Finite 인 지 (size에 의해 요구되는지) 확인할 수 없습니다.

당신은 명시 적 타입 서명을 지정하여이 문제를 방지 할 수 있습니다

:

의 문제점은 당신이 size에 대한 더미 인수를해야 할 것 같다,하지만 당신은 두 가지 유형 ab을 위해 인형을 통과 할 수
size (Left 1 :: Either Int String) 
0

단일 Either a b입니다. 아마 당신은 각 유형의 더미를 얻기 위해 elems를 사용할 수 있습니다

size _ = (size . head) (elems :: [a]) + (size . head) (elems :: [b]) 
0

나는 당신이 겪고있는 핵심 문제는 동시에 두 가지 다른 유형의 각각에서 데이텀을 나타내는 유형을 원하는 생각합니다. Either a b은 주어진 시간에 a 또는 b 중 하나 일 수 있습니다.

ab을 동시에 나타내는 단순한 데이터 형식은 2- 튜플입니다.그런 일에 대한 유형 서명은 하나를 만들기위한 표현이다, 따라서 패턴이 하나를 maching하는 (a, b)입니다 :

> :type (4,5) 
(4,5) :: (Num t, Num t1) => (t, t1) 
> let f (a, b) = 2*a + b 
> f (4,5) 
13 
당신과 같이, 2 튜플로 첫 선을 작성 고려해야

:

instance (Finite a, Finite b) => Finite (a, b) where 

Finite (a, b)은 무엇을 나타 냅니까? 멤버 함수 정의는 무엇입니까?

+0

사실 나는 이미 그 정의를 작성했습니다. 이것은 a와 b의 곱이며, 모든 a의 맵핑을 모든 b의 맵핑으로 작성합니다 – Fry

관련 문제