1

言語を試すためだけに haskell にフィボナッチ関数を実装しようとしていますが、プログラムをコンパイルするだけですでに行き詰まっています。次のコードがあります。

main = do
    fib :: (Num a) => a -> a
    fib 0 = 0
    fib 1 = 1
    fib x = fib (x - 1) + fib (x - 3)
    fib 348

何が間違っているのかわかりません。これは、コンパイル中のghcの出力ですghc --make fib.hs

[1 of 1] Compiling Main           ( fib.hs, fib.o )
fib.hs:3:15: parse error on input `=´

これが関連する場合、私はウィンドウを使用しています。

4

1 に答える 1

6

fib 0 = 0などは、でシーケンスできる「アクション」ではありませんdofib外部main(または in where、または in ) で定義let ... inしてから、それをどうするかを決定します。fib 348数値を計算するだけです。IOの結果が必要ですmain

近くに通訳はいませんが、次のようなものです。

main = do
  putStrLn $ show $ fib 348
  where
    fib 0 = 0
    fib 1 = 1
    fib x = fib (x - 1) + fib (x - 3)

またはこれ:

fib :: (Num a) => a -> a
fib 0 = 0
fib 1 = 1
fib x = fib (x - 1) + fib (x - 3)

main = do
  putStrLn (show (fib 348))

EDIT:以下のコメントと「スタックサイズが小さすぎる」について:コードにタイプミスがあり、盲目的にコピーしました。フィボナッチはfib x = fib (x - 1) + fib (x - 2); あなたfib (x - 3)のコードにあります。これは、 にfib 2達すると、 として評価されることを意味しfib 1 + fib (-1)ます。ここで、 を評価するfib (-1)と、それは無限ループになります。これは、「底から落ちた」ため、どんどん深くなっていきます。通常、スタックは無限ではありません。

また、この方法で大きなフィボナッチ数を (メモ化せずに) 計算すると、非常に非常に遅くなることにも注意してください。

于 2013-01-08T00:26:05.640 に答える