フィボナッチ数のリストのエレガントな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) -> [Integer]
fib' = ana $ \(x, y) -> Cons x (y, x+y)
完全な履歴を保存するための非汎用的な方法:
fib'' :: [Integer] -> [Integer]
fib'' = ana $ \[email protected](x:y:_) -> Cons x (x + y : l)
私はすでに自分自身を考え出しました:)ただ過去の値だけでなく、すべての過去の値を私に提供する組織形態のアナモフィックがありますか? – nponeccop
ああ、それはあなたが1つの*過去の値を持っていることではありません。あなたは*未来*値を持っていますが、数字の対称性のためにそのデータ構造を表現するのは簡単です(数字が1つ後のスライディングウィンドウ)。一般的に、すべての下部構造は可能な超構造をたくさん持っています。 "xの前にあるもののために計算された値"の型が必要な場合、それは* xに依存します。 20年前、フィボナッチはちょっとばかりのことだとわかる前に、スライディングウインドウのフィボナッチと値の再帰を一般化しようとしていたのです。 – pigworker