I持っHaskellでn番目のフィボナッチ数を計算するために、以下の、しばしば引用符で囲まれたコード:非pointfreeスタイルは実質的に遅いです
ghci> fibonacci 1000
:
fibonacci :: Int -> Integer
fibonacci = (map fib [0..] !!)
where fib 0 = 0
fib 1 = 1
fib n = fibonacci (n-2) + fibonacci (n-1)
は、私のような呼び出しを行うことができ、これを使用します
とほぼ瞬時に回答が届きます。それは、pointfreeスタイルではないように私は上記のコードを変更した場合
しかし、すなわち
fibonacci :: Int -> Integer
fibonacci x = (map fib [0..] !!) x
where fib 0 = 0
fib 1 = 1
fib n = fibonacci (n-2) + fibonacci (n-1)
それは実質的に遅いです。
ghci> fibonacci 1000
などのコールがハングする程度まで。
私の理解では、上記の2つのコードは同等でしたが、GHCiは異なっています。誰もこの行動の説明を持っていますか?
最初の定義は、\ x - > kで 'fibonacci = let k = map fib [0 ..]と似ています! x 'である。毎回それを再計算するのではなく、おそらく結果のリストを共有するでしょう。 – melpomene
えー、私は最初のものをすばやく簡単にするのはこの "共有"(メモ)です。しかし、なぜ2番目のものについて同じことをしますか? – MadMonty
GHCIでコードを実行していますが、最適化はしていません。 '-O2'で両方の関数をコンパイルしてみて、あなたの問題を解決するのにGHCが十分スマートであるかどうかを見てください。 – user2407038