2009-10-07 6 views
2

나는 두 벡터의 내적을 계산하기 위해 하스켈에서 다음 코드를 작성하지만, 다음 오류로 인해 컴파일 할 수 없습니다 나는 사전에 this question에서 살펴 보았다왜 하스켈은 '무한 유형을 구성 할 수 없습니다'오류가 발생합니까?

cannot construct infinite type: a = [a] When generalising the type(s) for dot'

dot :: (Num a) => [a] -> [a] -> a 

[] `dot` [] = 0 
[email protected][xi,xs] `dot` [email protected][yi,ys] = xi*yi + (xs `dot` ys) 

안내를 위해. 내가 알 수있는 한, 유형은 정확합니다. x, y 및 두 개의 []는 목록이고 함수는 숫자를 반환합니다.

은 어떤 문제가 있습니까?

+2

하스켈의 Object Reference Not Set 또는 Stack Overflow와 비슷한 점이 많습니다. –

답변

7

두 요소 목록 [x, y]에 대한 구문을 목록을 첫 번째 요소와 나머지 목록으로 분할하는 구문을 혼동하는 경우 (x:y). 대신 다음을 시도하십시오.

dot :: (Num a) => [a] -> [a] -> a 

[] `dot` [] = 0 
[email protected](xi:xs) `dot` [email protected](yi:ys) = xi*yi + (xs `dot` ys) 

@ 패턴도 필요하지 않습니다.

+0

고마워요, 그 트릭을 많이했습니다. – Zaid

8

Ganesh' answer입니다. "무한한 유형"의 의미에 대해 간단히 설명해 드리겠습니다.

dot :: (Num a) => [a] -> [a] -> a 

dotNum 요소의 두리스트를 취하고 Num를 반환한다는 의미

dot이 유형의 정의를 가지고있다. 가네가 지적으로 [xi,xs]Num S되어야 두 요소 xixs 구성된 목록, 이후

[email protected][xi,xs] `dot` [email protected][yi,ys] = xi*yi + (xs `dot` ys) 

: 사용자 정의는이 광고를 포함한다. yiys과 동일합니다. 그러나 그들은 dot에 인수로 전달됩니다

xs `dot` ys 

xsysNum의 목록이 될해야한다는 것을 의미합니다. 그것은 모순으로 이어집니다.


이 바라 보는 또 다른 방법은, 한 순간이 dot의 유형 정의에 대해 잊지 위해하는 것입니다. 이 라인은

[email protected][xi,xs] `dot` [email protected][yi,ys] = xi*yi + (xs `dot` ys) 

dot이 요소가 dot에 적절한 인수 두 개의리스트를 취한다고. 그러나이 목록이 의미가있는 유일한 방법은 이 무한히 중첩 된 경우입니다.. 그것은 허용되거나 합리적인 것이 아닙니다.

+0

@ 스탄 : 설명 해줘서 고마워. 나는 xs와 ys가리스트의리스트라는 것을 의미 할 것이기 때문에 [xi : xs] 표기법조차도 실패한 이유를 제거했다고 생각한다 ... 나의 해석이 유효한지 알려 달라. – Zaid

+0

@Zaid : 맞습니다. 'xi :: a'이면'(xi : xs) :: [a]'와'[xi : xs] :: [[a]]'입니다. 그러므로'[xi : xs]'에 매치하고'xs'를 재귀 적으로 전달하면 실제로 무한 타입의 에러가 발생합니다. – Stephan202

관련 문제