1

我正在研究第二欧拉问题,但现在我只是想定义斐波那契数列。目前,我将 Fib 函数定义为

Fib 0 = 0
Fib 1 = 1
Fib x = Fib (x - 1) + Fib (x - 2)

因为我希望程序依赖于我的键盘输入,所以我使用了

main = do
        putStrLn "Enter desired Fibonacci index: "
        "index" <- getLine
        putStrLn Fib x

并将 x 定义为x = read "index"

我很确定我把缩进和语法都搞砸了。根据我修改代码的方式,运行“ghc /dir/file.hs”会得到类似“不在范围内:数据构造函数‘Fib’”或“解析错误(可能是不正确的缩进)”之类的东西。我真的,真的不不知道我在做什么,尤其是关于如何设置 .hs 以使其对编译器友好。我已经阅读了大约 7 个关于使用 GHC 编译的教程,但他们似乎都跳过了他们解释的部分编译的基本要求。

如果有帮助,请告诉我如何更具体。我认为我试图理解的两件事是整个“主要”事物与编译的关系,以及如何让我认识到我已经将 Fib 定义为一个函数,即使它说它不在范围内。

PS:这里的缩进我想不通,Stack好像想把所有的东西都放在一行里,所以我只好把它都分开了。对不起。

4

5 回答 5

9

Fib 的第一个字母不应该大写。大写的单词表示一种类型。函数应以小写字母开头。

编译看起来不错!

编译时还会遇到一些其他错误。请记住,它putStrLn需要 aString作为参数。您的fib函数返回一个Integer. 您可以使用show将值转换为String.

于 2009-12-19T08:14:21.210 回答
5

简单总结一下:

  • 你的缩进看起来不错。
  • 函数名不能以大写字母开头。大写的标识符仅用于构造函数、类型和模块名称。
  • 您可以使用交互式解释器测试您的东西,并且不需要 main 函数。
  • 如果你想存储一些计算的结果,你需要一个变量名,所以getLine结果应该绑定到 a index,而不是"index"。第一个是字符串变量,而不是字符串
  • putStrLn只接受一个参数(要显示的字符串)。在您的程序中,它接收两个参数:一个函数Fib和一些 undefined x
  • 顺便说一句,您需要定义x,可能read用于将输入字符串转换为整数值。
  • 此外,putStrLn需要一个字符串并Fib返回一个整数,您需要在传递它之前对其进行转换:putStrLn (show (Fib x))
于 2009-12-19T12:36:56.367 回答
2

这是您的代码,已修复,以便您可以实际编译它。

fib 0 = 0
fib 1 = 1
fib x = fib (x - 1) + fib (x - 2)

main = do
        putStrLn "Enter desired Fibonacci index: "
        index <- getLine
        print (fib (read index))

你有几个问题。函数以小写字母开头。其次,您不能应用putStrLn到的结果,fib因为fib返回一个整数并putStrLn期望 a String。所以我print改用了。此外,您尝试使用字符串 ( "index") 作为变量。确实,您得到了Stringfrom,getLine但它必须存储在变量中,并且变量周围没有引号。

请注意,正如 Barry 所说,您实际上并不需要该main功能。只需将您的斐波那契函数放在一个文件中,将其加载到 ghci 并从那里调用该函数。十分简单。

另外,请注意您的斐波那契函数非常慢,但我希望您已经意识到这一点。

祝欧拉问题好运。我发现使用 Haskell 解决它们非常有趣。

于 2009-12-22T15:14:29.450 回答
1

不要打扰主要功能。只需启动 ghci,加载您的模块,然后直接调用 fib 函数。

于 2009-12-19T08:29:56.133 回答
1

IIRC,getLine返回一个字符串,所以你应该将它绑定到一个变量

do
   idx <- getLine
   print $ fib $ read idx
于 2009-12-19T09:26:28.230 回答