피보나치 번호 목록의 우아한 derinition이 있습니다 :Corecursive 피보나치 사용하여 재귀 기법
fibs :: [Integer]
fibs = fib 1 1 where
fib a b = a : fib b (a + b)
이 recursion-schemes
라이브러리를 사용하도록 변환 할 수 있습니까?
내가 얻을 수있는 가장 가까운 완전히 다른 접근 방식 사용하는 다음 코드입니다 : 내가 코드 필요한 경우의 나머지 부분을 제공 할 수
fibN' :: Nat -> Integer
fibN' = histo $ \case
(refix -> x:y:_) -> x + y
_ -> 1
을하지만, 기본적으로 나는 histomorphism의를 사용하여 N 번째 피보나치 수를 얻을 Nat = Fix May. Maybe (Cofree Maybe a)
은 [a]
과 동형이기 때문에 refix
은 toList
과 같이 일종의 패턴으로 생각할 수 있습니다.
UPD는 :
나는 짧은 코드를 발견하지만 단지 저장 한 값과 제네릭이 아닌 방법 :
fib'' :: [Integer] -> [Integer]
fib'' = ana $ \[email protected](x:y:_) -> Cons x (x + y : l)
: 전체 역사를 저장하는
fib' :: (Integer, Integer) -> [Integer]
fib' = ana $ \(x, y) -> Cons x (y, x+y)
비 일반적인 방법
나는 이미 그 자신을 알았다. 과거의 모든 가치를 제공하는 histomorphic anamorphism이 있는가? – nponeccop
아,하지만 당신이 과거 * 가치가 있다는 것은 아닙니다. 당신은 하나의 * 미래 * 가치를 가지고 있지만 숫자의 독특한 대칭 때문에 그 데이터 구조를 표현하는 것이 쉽습니다 (모든 가치는 * 하나의 후계자를가집니다). 일반적으로 모든 하부 구조물에는 가능한 많은 수퍼 구조물이 있습니다. "x 전에 물건에 대해 계산 된 값"유형을 원하면 x에 종속 *됩니다. 20 년 전 필로 나치가 우연이라는 사실을 깨닫기 전에 슬라이딩 윈도우 피보나치와 값의 재귀를 일반화하려고 노력하면서 평생 몇 달을 보냈습니다. – pigworker