f :: Integer -> Integer -> [Integer]
f i n = n : f (i+2) (n+i)
누군가가 나에게 설명하는 것을 설명 할 수 있습니까? 나는 그것이 [0,1,4,9,16 ..]을 반환한다는 것을 알고 있지만 어떻게 이해할 수 없다. n : f
의미누군가 나에게 다음과 같은 하스켈 표현을 설명 할 수 있습니까?
f :: Integer -> Integer -> [Integer]
f i n = n : f (i+2) (n+i)
누군가가 나에게 설명하는 것을 설명 할 수 있습니까? 나는 그것이 [0,1,4,9,16 ..]을 반환한다는 것을 알고 있지만 어떻게 이해할 수 없다. n : f
의미누군가 나에게 다음과 같은 하스켈 표현을 설명 할 수 있습니까?
:
은 "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과 다른 함수형 프로그래밍 언어에 깊이 익숙해지면서 익숙해 질 개념입니다.
형식 오류 및 구문 오류가 포함되어 있으므로 문제의 코드는 아무런 성과가 없습니다. 당신이 마지막 비트를 강조에서 볼 수 있듯이 --
는 하스켈 코멘트를 시작하기 때문에
f :: Integer -> Integer --> [Integer]
코멘트입니다. 결과적으로 f
의 선언 된 유형은 Integer -> Integer
이며 잘못된 것입니다. 이 변경 사항을 해결하려면 -->
을 ->
으로 수정하십시오. 여기
f i n = n : f (i+2) (n+i]
당신은 개방 (
다음 닫는 ]
있습니다. 분명히 그것이 틀렸다. 이 변경 사항을 해결하려면 (n+i]
을 (n+i)
으로 변경하십시오.
:
목록 유형에 대한 생성자입니다 : 그 이루어집니다 것으로, 여기에 고정 된 코드가하는 일입니다 이제
. x : xs
은 x
을 머리로하고 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)
인 목록을 만듭니다.
예문에 구문 오류가 있습니다 ... – sth
+1 *이 *는 숙제 질문하는 법입니다. – luqui