2013-11-03 2 views
4

피보나치 숫자를 생성하기 위해이 코드를 보았습니다.하스켈이 무한한 목록을 생성하는 방법?

fibs = 1:1:(zipWith (+) fibs (tail fibs))

유사한 스타일 코드가 무한리스트 생성하도록 기록 될 수있다 [1 ..]?

하스켈 사이트에서이 link on cyclic structures을 보았습니다.

는 예는이

cyclic = let x = 0 : y 
     y = 1 : x 
    in x 

내가 순환 방식으로 내 문제에 대한 목록을 정의하려고

을 부여하고 있지만 성공하지 못했습니다. 내가 원하는 것은 자체적으로 정의 된 목록이며 Hasekll에서 [1 ..]로 평가되는 목록입니다.

참고 : 하스켈 [1..][1,2,3,4,5...]으로, [1,1,1...]으로 평가되지는 않습니다.

+0

'ones = 1 : ones' –

+0

이것은 하스켈의'[1 ..]'과 같지 않습니다. Haskell'[1. ..]'은'[1,2,3,4,5 ...]'로 평가되고, 당신의 평가는'[1,1,1,1 ...]'입니다. –

+0

아, 그래. 'nats = 1 :지도 (+1) nats'. –

답변

8

다음은 당신에게 원하는 결과를 제공해야합니다 :

nats = 1 : map (+1) nats 

또는 더 관용구 :

nats = iterate (+1) 1 

그것은 첫 번째 조각이 등식 추론을 사용하여 [1,2,3...]으로 평가되는 이유를 쉽게 :

nats = 1 : map (+1) nats 
    = 1 : map (+1) (1 : map (+1) nats) 
    = 1 : map (+1) (1 : map (+1) (1 : map (+1) nats)) 
    = 1 : 1 + 1 : 1 + 1 + 1 : .... 
    = [1,2,3...] 
+0

'nats = iterate succ 1'은 내 의견으로는 어떤 일이 일어날 지 더 나은 직감을 제공합니다. 후임자 함수를 계속해서 적용하면 자연스럽게 자연물이 생깁니다. – kqr

+0

@kqr : 만약 당신이 0에서 시작한다면 그것은! – yatima2975

5

예.

는 목록의 각 요소를 쓸 수있는 방법에 대해 생각해

1 
1 + 1 
1 + 1 + 1 
1 + 1 + 1 + 1 
1 + 1 + 1 + 1 + 1 

각 항목 후, 이후의 모든 항목이 추가 + 1 있습니다. 따라서 우리는 1에서 시작하여 각각의 후속 요소에 1을 추가하려고합니다. 그런 다음 두 번째 요소를 가져 와서 그 후에 모든 요소에 1을 추가하려고합니다. 여기

우리가이 작업을 수행하는 방법은 다음과 같습니다

let xs = 1 : map (+ 1) xs 

이이 같은 확장 : 등등

1 : map (+ 1) xs 
1 : (1 + 1) : map (+ 1) xs 
1 : (1 + 1) : ((1 + 1) + 1) : map (+ 1) xs 

합니다.

관련 문제