2014-03-13 2 views
0
mymap f _ [] = [] 
mymap f x (y:ys) = f first y : mymap (f x ys) 
    where if x /= [] first = head(x) else --there will not be else just playing around 

기본 제공지도를 구현하는 것이지만 하나의 목록 대신 f에는 2 개의 인수 (목록)가 있습니다. ys가 []가되면, mymamp를 호출하여 새로운 목록을 만들고 싶습니다. x 대신 tail (x) == xs를 사용하고 xs가 []가 될 때까지 계속하겠습니다. 그리고이 모든 목록을 최종 목록에 추가하십시오. 하지만 자동/재귀 적 방법을 찾을 수 없습니다.수표 검사 : 무한 유형을 구성 할 수 없습니다. a0 = [a0]

+0

''zipWith'와 비슷한 것을하려고합니까? – bheklilr

+0

구문 오류가 있습니다. 'where' 절은 정의를 포함하고 있지만 여기에'if' 표현식을 썼습니다. http://learnyouahaskell.com/ –

답변

1

우선 x이 비어 있지 않음을 확인하지 않고 head(x)을 호출하고 있습니다. 좋은 생각이 아닙니다. 대신 x에서 패턴 일치를 사용하십시오! 이제

mymap f _ [] = [] 
mymap f (x:xs) (y:ys) = f x y : f x ys 
-- add the other cases as well 

오류 : 통지는 장소로 f을 사용하고 있습니다 :

  1. f first y - 여기에 F 타입의 a->b->c

  2. f x ys이다 - 여기에서 F 형이다 [a]->[b]->c

하스켈은 f의 타입을 추론 할 수 없으므로, 교육 된 추측을하고 다른 변수의 타입을 추론하지 못합니다 - 따라서 에러.

이 경우 가장 좋은 조언은 mymap에 유형 서명을 추가하는 것입니다. 하스켈은 똑똑한 언어이며 대부분의 경우 형식 서명 없이도 잘 관리 할 수 ​​있습니다. 이고 그 중 하나가 인 경우이면 코드가 유효합니다. 항상 형식 서명으로 시작하십시오.

+0

과 같은 하스켈 튜토리얼을 실제로 읽어야합니다. 코드를 편집했습니다. 지금은 어때? –

+0

당신의 코드가 지금 구문 분석을한다고 생각하지 않습니다 -'where' 절은 그렇게 정의되지 않았습니다. 나는 패턴 매칭 접근법을 정말로 추천 할 것이다. – Benesh

+0

나는 haskell을 싫어 : ( –

관련 문제