2014-03-13 7 views
2

cumfib의 각 요소에 대해 fib가 start로부터 평가됩니까?확장 목록의 평가 빈도는 얼마나됩니까

fib = (1:1: zipWith (+) fib (tail fib)) 
cumfib = [ sum $ take i fib | i<-[1..]] 

또는 cumsum의 요소 (i + 1)에 대해 캐시되고 재사용되는 첫 번째 요소는 무엇입니까?

필자는 fib가 동일한 람다 식에서 사용되고 따라서 단 한번 계산된다는 것을 추측합니다.

또한 i 번째 피보나치 수를 계산하는 빈도에 관한 fib 문제를 구현합니까? 내 실제 문제는 피보나치 수 대신 소수 (prime number)를 염두에두고있다. 피보나치 수는 어떤 숫자 n의 소수 요소를 쉽게 계산할 수 있도록 '캐시'하고 싶다. 그러나, 나는 단지

takeWhile (\x-> x*x<n) primes 

의 소수를 사용합니다. 내가 더 큰 N, 소수 증가의 부분 집합 먼저하고 나중에 작은 n에 요인을 평가하고, 내가 할 경우 따라서 나는 소수가 평가하는 빈도, 궁금해 이후 : 소수 번 평가 여부

primes = ... some way of calculating primes ... 
helpHandlePrimes ... = ... using primes ... 
handlePrimes = ... using primes and helpHandlePrimes ... 

은 알려 주시기 바랍니다 , 여러 번 또는 내가이 질문을 어떻게 공식화했는지에 따라 결정할 수 없는지에 대해

+2

'fib'가 어디에 쓰여 있는지에 따라 달라질 수 있습니다. 최고 수준의 가치입니까? 아니면 일부 함수에서 let 제본 변수입니까? – Ingo

+0

최상위 레벨이지만 someFuntion ... = .... 여기서 fibsOfInterest = takeWhile (<= 1000) fibs는 여전히 작동합니까? – Herbert

+1

예, 재검사가 필요없는 fibs는 필요에 따라 확장 될 것입니다. – Ingo

답변

5

일반적으로 let-bound 항목은 해당 범위 내에서 공유됩니다. 특히 모듈의 최상위 용어는 전체 프로그램에서 공유됩니다. 그러나 유형에주의해야합니다. 용어가 함수라면 공유는 람다 추상화 만 공유됨을 의미하므로 함수는 메모되지 않습니다. 오버로드 된 용어는 내부적으로 함수로 표시되므로 오버로드 된 용어에 대해서도 공유는 의미가 없습니다.

따라서 숫자의 단일형 목록이 있으면 공유 할 것입니다. 기본적으로 fib과 같은 목록은 "단일 형태 제한"(실제로 유용한 경우가 있기 때문에) 때문에 단일 양식이됩니다. 그러나 요즘은 단사 사상 제한을 해제하는 방식으로, 그래서 어떤 경우에 나는 같은

fib :: [Integer] 

이 확실하고이 될 것으로 기대하고 모든 사람에게 명확하게하기 위해 명시 적 타입 서명을주는 것이 좋습니다 단일형 목록.

0

이렇게 덧붙이고 싶습니다. cumfib은 불필요하게 첫 번째 i 요소의 합계를 fib으로 다시 계산합니다.

cumfib = tail $ scanl (+) 0 fib 
+0

귀하의 의견에 감사 드리며 귀하는 옳았습니다. 그러나 이것은 제 질문에 대한 답변이 아닙니다. – Herbert