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 `=´

如果这是相关的,我正在使用 Windows。

4

1 回答 1

6

fib 0 = 0等不是可以在do. 定义fibmain(或内where,或内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))

编辑:关于下面的评论和“堆栈大小太小”:您的代码中有一个错字,我盲目地复制了它。斐波那契是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 回答