2012-10-21 1 views
8

:왜 (오드) 오류를 추론 할 수 없습니까? 내가 요소의 작은 합계 :</p> <pre><code>shortest :: (Num a) => [[a]] -> [a] shortest [] = [] shortest (x:xs) = if sum x < sum (shortest xs) then x else shortest xs </code></pre> <p>나에게 다음과 같은 오류를 제공하여 목록을 찾기 위해 노력하고

Could not deduce (Ord a) arising from a use of `<' 
from the context (Eq a) 
    bound by the type signature for shortest :: Eq a => [[a]] -> [a] 
    at code.hs:(8,1)-(9,71) 
Possible fix: 
    add (Ord a) to the context of 
    the type signature for shortest :: Eq a => [[a]] -> [a] 
In the expression: sum x < sum (shortest xs) 
In the expression: 
    if sum x < sum (shortest xs) then x else shortest xs 
In an equation for `shortest': 
    shortest (x : xs) 
     = if sum x < sum (shortest xs) then x else shortest xs 

하지 않는 이유는 함수의 유형 체킹?

+0

'최단'은 실제로이 이름이 맞지 않습니까? -'Data.List'와'Data.Function'의 고차 함수를 사용하여'minimumBy (compare \'on \'sum)'을 사용해보십시오. – leftaroundabout

+1

이 문제를 이해하려면 모든 번호를 주문할 수있는 것은 아님을 아는 것이 중요합니다. 예를 들어, '1 + 2i'와 같은 복소수를 고려해보십시오. 그 (것)들을 주문하는 표준 방법이 없다. – dflemstr

+1

@leftaroundabout은 이미 라이브러리 함수를 사용하여 솔루션을 제안했습니다. 그러나 운동으로 처음부터 그것을 쓰고 싶다면 형식 시그니처 문제를 해결하는 것 외에'가장 짧은 []'의 값을 고려해야합니다. 다시 말하면 재귀의 기초가되어야합니다 (힌트 : 빈리스트에는'minimum'과'maximum'이 정의되어 있지 않습니다.) –

답변

15

이 코드에는 두 가지 유형 클래스 인 NumOrd이 있습니다. 유형은 이고 Ord이 아닌 구성원 일 수 있으며 그 반대도 마찬가지입니다.

sum의 유형은 Num a => [a] -> a이므로 입력 요소는 shortest이어야하며 Num이어야합니다.

sum x < sum (shortest xs) 

이것은 당신이 a들에 운영자 <을 사용하는 것을 의미하지만, 당신의 유형 서명에 당신은 a의이 정의 Ord의 인스턴스가 될 것을 요구하지 않은 : 당신은 또한 코드에서 를 다음을 수행하십시오 < :

class Eq a => Ord a where 
    compare :: a -> a -> Ordering 
    (<) :: a -> a -> Bool 
    ... 

따라서 당신은 당신의 유형 서명에 그 요구 사항을 추가해야합니다

shortest :: (Ord a, Num a) => [[a]] -> [a] 

또는 유형 서명을 생략 할 수 있습니다.

+4

이러한 유형의 문제를 진단하고 동시에 유형과 입력란에 대해 자세히 알아 보려면 형식 서명을 일시적으로 제거하고 모듈을 GHCi로로드 한 다음 ": t shortest"를 입력하여 컴파일러가 할당됩니다. 마찬가지로 형식 시그니처를 생략했다면 추가하여 함수에 원하는 형식 시그니처가 있는지 확인하십시오. 나는이 기술을 사용하여 많은 것을 배웠다. – mhwombat

5

Num이 없으므로 Ord 제약 조건이 a에 누락되어 있습니다. 그것은

shortest :: (Num a, Ord a) => [[a]] -> [a] 

당신은 유형 서명을 제거 할 수 있어야하며 GHC는이 추론됩니다.

관련 문제