2013-02-28 4 views
0

map2는 두 개의 목록 ls1과 ls2와 함수 F를 취해 ls1과 ls2 중 가장 짧은 것과 동일한 길이의 목록을 반환합니다. 이는 i 번째 요소가Haskell의 고차 함수 - "No instances for ..."

module Map2 where 

map2 lst1 lst2 f = map2_iter lst1 lst2 f len 0 [] 
    where len = (min (length lst1), (length lst2)) 
map2_iter (x:lst1) (y:lst2) f len i acc = if (i == len) 
         then acc 
         else let res = (f x y) in 
         map2_iter (lst1) (lst2) (f) (len) (i+1) ((res):acc) 
map2_iter [] [] f len i acc = [] 

(순서대로) LS1과 LS2의 i 번째 요소에 F를 적용한 결과입니다 내가 정말 모르겠어요 다음과 같은 오류

Map2.hs:3:20: 
No instances for (Eq (Int -> Int), Num (Int -> Int, Int)) 
    arising from a use of `map2_iter' 
Possible fix: 
    add instance declarations for 
    (Eq (Int -> Int), Num (Int -> Int, Int)) 
In the expression: map2_iter lst1 lst2 f len 0 [] 
In an equation for `map2': 
    map2 lst1 lst2 f 
     = map2_iter lst1 lst2 f len 0 [] 
     where 
      len = (min (length lst1), (length lst2)) 

있어 이 오류가 의미하는 것. 아무도 도움을 줄 수 있습니까?

또한 이것은 hw가 아니라 테스트 준비입니다.

+4

Shoud이 기능을 사용하면 결과가 반대로 나옵니다. 'zipWith'와는 달리, 여러분의 기능이 실제로하는 일을한다고 생각합니다. 그러나이 작업을 시작하기 전에 다른 길이의 목록을 사용하자마자 패턴 일치 오류가 발생합니다. – Ingo

답변

4

오류 메시지는 Int -> Int 함수가 같음을 비교할 수없고 (Int -> Int, Int) 튜플이 숫자가 아님을 알려줍니다. 왜 이걸 말해주는거야? 코드에서 len(Int -> Int, Int) 튜플이므로이 값을 비교하여 숫자로 취급하려고합니다.

그럼 len은 어떻게 끝났습니까? (,)은 하스켈에서 튜플을 만드는 데 사용됩니다. (x,y)을 쓰면 첫 번째 요소가 x이고 두 번째 요소가 y 인 튜플이 생성됩니다. 따라서 (min (length lst1), (length lst2))은 첫 번째 요소가 min (length lst1)이고 두 번째 요소가 length lst2 인 튜플을 만듭니다. 따라서 함수를 포함하는 튜플로 끝납니다 (min (length lst1)는 함수로 계산되기 때문에).

추신 : 나는이 기능을 꼬리 재귀 적으로 쓰는 것이 좋은 생각이 아니라는 점을 지적해야합니다. 작성한 방식에 따라 전체 결과가 생성 될 때까지 결과의 첫 번째 요소에 액세스 할 수 없으며 결과 목록의 순서가 잘못됩니다. 보다 "순진한"비 꼬리 재귀 방식으로 작성하면 더 게으 르므로 성능이 향상됩니다. 그것은 또한 더 간단 할 것이다.

+0

아, 그 말이 맞습니다. 이 함수를 작성하는 "순진한"비 꼬리 재귀 적 방법을 제공 할 수 있습니까? – kachilous

+1

zipWith 함수를 살펴보십시오. – augustss

+1

와우 zipwith이 문제에 대해 놀라운 작품. 감사! – kachilous