2015-02-02 3 views
5

각 요소가 모든 이전 요소의 함수 인 무한 목록을 정의하고 싶습니다.이전 요소를 기반으로 목록의 다음 요소를 계산하십시오.

목록의 n+1 요소는 f [x1, x2, ..., xn]입니다.

이것은 간단 해 보이지만 어떻게 할 지 고민 할 수는 없습니다. 누구든지 도와 줄 수 있습니까?

+0

가, 난 그냥 [다른 질문에 대한 답변]를 썼다 (http://stackoverflow.com/a/28101516/791604) 그냥 않습니다. –

답변

10
gen f = xs where xs = map f $ inits xs 

또는

gen f = fix $ map f . inits 
+0

'inits' 즉,! –

+1

'inits xs '는'xs'를 보지 않고 첫 번째 원소'[]'를 주므로'f [] :'또는'tail $'이 실제로 필요하지 않습니다. –

+0

@ Ørjan Johansen, 아, 네. 감사. – user3237465

2

당신은 unfoldr를 사용할 수 있습니다이있다

import Data.List 

gen :: ([a] -> a) -> a -> [a] 
gen f init = unfoldr (\l -> let n = f (reverse l) in (Just (n, n:l))) [init] 

메모 입력 목록 매번 반전. 대신 Data.Sequence을 사용할 수

import Data.Sequence 

genSeq :: (Seq a -> a) -> a -> Seq a 
genSeq f init = unfoldr (\s -> let n = f s in (Just (n, s |> n))) (singleton init) 
+0

이것은 목록에서 잘못된 방향으로 전달합니다. https://ideone.com/TLoi2U를 참조하십시오. –

4

을 대안으로 다른 대답에, 희망이 조금 더 읽기 미만 간결한 :

-- "heads f" will generate all of the the prefixes of the inflist 
heads f = map ((flip take) (inflist f)) [1..] 
-- inflist will generate the infinite list 
inflist f = (f []) : map f (heads f) 

-- test function 
sum1 s = 1 + sum s 

-- test run 
>> take 5 (inflist sum1) 
[1,2,4,8,16] 

UPD :로 대체 할 수 heads 기능 위에서 지적한 바와 같이 inits, 나는 그것의 존재를 알지 못했다. 우연히

+1

7.8.4 이전의 GHC 버전에서는'inits'가 매우 느리기 때문에 버전이 더 좋을 것입니다. 7.8.4 이상에서는 'inits'가 잘 작동합니다. – dfeuer

관련 문제