2012-04-29 1 views
3

목록의 머리글 (r)을 sack 목록에 추가하려고하는데이 오류 메시지가 계속 나타납니다.목록과 단일 항목을 결합 할 때 보호 조건에 오류가 있습니다.

ERROR "Knapsack.hs":35 - Type error in guarded expression 
*** Term   : findItems rt (r : sack) (getTotalWeight sack r) 
*** Type   : [Item] 
*** Does not match : [[Item]] 

코드는 다음과 같습니다. sack 이미 유형 [Item]의 때문에

findItems :: [Item] -> [Item] -> Float -> [Item] 
findItems (r:rt) sack total 
      | total > 20 = [sack] 
      | canContinue = findItems rt (r : sack) (getTotalWeight sack r) 
      | otherwise = [sack] 
      where canContinue = (getTotalWeight sack r) < 20 

답변

6

당신은 너무 [sack] 유형 [[Item]]이며, findItems에서 [sack]을 반환 할 수 없습니다. 브래킷을 분리하십시오.

메시지가 아마도 ([Item] 예상대로 반환하지 않습니다)에 사건에 대해 불평하는 이유 하스켈은 모든 경우에 동일한 유형의 것으로 기대하는 (내가 여기 추측하고있어), 그래서 확인 그들이 첫 번째 유형과 동일한 유형의 것이고, 이는 실수로 [[Item]]입니다. 이 검사는 표현식의 유형을 findItems 유형으로 조정하기 전에 발생하는 것처럼 보입니다. 하스켈 구루가 아마 여기에 더 세밀한 포인트에서 나를 바로 잡을 수있을 것입니다 :)

+1

정말 고맙습니다. 저는 하스켈을 처음 접했고 그 실수를 이전에 만들었고 그것이 문제라고 생각하지 않았습니다. –

+2

GHC로 컴파일하려고하면 예상되는 타입 \'Item '과'[Sack]'의 실제 타입 \'[Item]''을 비교할 수 없습니다. 어떤 오류 메시지가 나타나는지는 유형 검사 알고리즘의 구현에 따라 다릅니다. Hugs는 GHC와는 다릅니다. –

+0

자동 유형 유추의 일반적인 속성은 유형 오류가 _ 생할 때 오류가 _ 정확한 _ 정확한 _ 정확한 _ _ _ _ _ 일 _ _ _ _ _ _ _ _ 않습니다. 서로 다른 컴파일러와 해석기가 코드의 다른 부분을 가리킬 것입니다. – MathematicalOrchid

3

Hugs가 GHC와는 다른 방식으로 형식 검사를하는 것처럼 보이는 "Hugs-ism" . 일반적으로 그들은 더 할 수있다, 이럴,하지만 (더 나은 오류 메시지를 생성하는 것이 GHCi 나타납니다이 경우

| total > 20 = [sack] 

: 당신이 GHCi에 동일한 코드를 연결하면 실제로이 포함 된 행을 가리키는 오류가 발생합니다 필요 이상으로 비밀 스럽다!).