2017-05-13 1 views
0

왜이 오류가 발생합니까? 나는 하스켈을 배우기위한 테스트로 이것을 시도하고 있는데, 두 번째 입력에서 튜플을 그냥 묶는 것이다. 왜 이것이 컴파일되지 않습니까? 고맙습니다.예상 유형 '(Int, Int)'을 실제 유형 '[t0]'과 일치시킬 수 없습니다.

test :: (Int,Int) -> [(Int,Int)] -> Int 
test [] [] = [] 
test xs [] = [] 
test (x,xs) (y:ys) = test (x,xs) ys 

감사합니다. 첫 번째 오류를 지적하기위한 @Carcigenicate. 우리가

test :: (Int,Int) -> [(Int,Int)] -> Int 
test xs [] = [] 
test (x,xs) (y:ys) = test (x,xs) ys 

이있는 경우 지금은 얻을

• Couldn't match expected type ‘Int’ with actual type ‘[t0]’ 
• In the expression: [] 
    In an equation for ‘test’: test xs [] = [] 
+0

첫 번째 인수가 2- 튜플이라고 가정 했으므로 첫 번째 정의에서 목록과 패턴을 일치 시키려고했습니다. 튜플은 비어있는 iirc 일 수 없습니다. – Carcigenicate

+0

'test' 함수의 첫 번째 인수는 튜플이고 두 번째는 튜플 목록이지만 패턴 일치가 올바르지 않습니다. – Redu

+0

함수는 int를 반환한다고 말하면 int가 아닌 해당 줄에서 []를 반환하려고 시도합니다. – Carcigenicate

답변

4

함수 서명은 첫 번째 인수가 2 개 INT의 튜플 수 있지만 다음 첫 번째 패턴 매칭 라인에해야한다고 말한다 :

test [] [] = [] 
    ^

튜플을 목록과 대조합니다.

  1. 유형이 일치하지 않으므로 오류가 발생합니다.

  2. 튜플은 어떤 유형이 아닌 한 결코 비어 있지 않습니다. 목록과 달리 튜플은 추가하거나 제거 할 수 없습니다. 고정 된 크기입니다.

튜플에 2 개의 값이 있다고 말하면 항상 2 개의 값을 갖습니다. 비어 있는지 확인할 필요가 없습니다. 합법적이거나 유용한 일을하지 않기 때문에 선을 없앨 수있는 것처럼 보입니다.

또한 이름이 약간 혼란 스럽습니다. 일반적으로 xxs은 컬렉션의 헤드 및 테일을 나타냅니다. 튜플에는 실제로 "슬롯"이 전혀 없습니다.

+0

이봐, 고마워, 나는 그것을 제거하고 "실제 유형 '[t0]'으로 예상 유형 'Int'과 일치 할 수 없음" –

+0

@ 엘바치 어디에서? 정확한 오류가 무엇입니까? – Carcigenicate

+0

수정으로 추가 할 것입니다. –

관련 문제