2011-01-04 5 views

답변

10

:은 "cons"연산자이고 head가 왼쪽 값 인 새 목록을 구성한다. 꼬리가 운전자의 오른쪽에있는 값입니다. 따라서 0 : [1, 2, 3][0, 1, 2, 3]입니다.

체크 다음 f 1 0을 평가 함수의 동작은 :

f 1 0 = 0 : f 3 1 

f 1 0 꼬리 등 f 3 1 의해 리턴 머리 0 이루어진 새로운 목록과 목록을 작성하는 결과이다.

f 3 1 = 1 : f 5 4 

f 3 1은 꼬리 등 f 5 4 의해 리턴 머리 1 이루어진 새로운 목록과 목록 작성의 결과 다음과 같다 : 마찬가지로, f 3 1이다.

따라서 함수는 반복적으로 목록을 작성합니다. 또한 무한히 꼬리 재귀 적이며 (종료 조건이 없으므로) 무한히 긴 목록이됩니다. 초기 라인 f :: Integer -> Integer -> [Integer]로서는

,이 f 정수 목록 ([Integer])을 두 개의 정수 (Integer -> Integer)을 취하고 반환하는 함수임을 나타낸다. 엄밀히 말하면 f은 정수 (Integer)를 취하여 정수를 취하는 함수를 반환하고 함수 currying의 결과로 정수 목록 (Integer -> [Integer])을 반환합니다. 이것은 Haskell과 다른 함수형 프로그래밍 언어에 깊이 익숙해지면서 익숙해 질 개념입니다.

5

형식 오류 및 구문 오류가 포함되어 있으므로 문제의 코드는 아무런 성과가 없습니다. 당신이 마지막 비트를 강조에서 볼 수 있듯이 --는 하스켈 코멘트를 시작하기 때문에

f :: Integer -> Integer --> [Integer] 

코멘트입니다. 결과적으로 f의 선언 된 유형은 Integer -> Integer이며 잘못된 것입니다. 이 변경 사항을 해결하려면 -->->으로 수정하십시오. 여기

f i n = n : f (i+2) (n+i] 

당신은 개방 ( 다음 닫는 ] 있습니다. 분명히 그것이 틀렸다. 이 변경 사항을 해결하려면 (n+i](n+i)으로 변경하십시오.

: 목록 유형에 대한 생성자입니다 : 그 이루어집니다 것으로, 여기에 고정 된 코드가하는 일입니다 이제

. x : xsx을 머리로하고 xs을 꼬리로 사용하는 목록입니다. n : f (i+2) (n+i)n : (f (i+2) (n+i))으로 해석됩니다 (믿을 것 같지 않은 (n : f) (i+2) (n+1)). 따라서 머리가 n이고 꼬리가 f (i+2) (n+1) 인 목록을 만듭니다.

관련 문제