Haskell编译的基础知识

时间:2009-12-19 08:10:03

标签: haskell parsing compilation ghc

我正在研究第二个Euler的问题,但是现在我只是试图定义Fibonacci序列。目前,我将我的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定义为一个函数,即使它说它不在范围内。 / p> PS:我无法弄清楚这里的缩进,Stack似乎想把所有东西放在一行,所以我必须把它全部分开。抱歉。

5 个答案:

答案 0 :(得分:8)

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

编译看起来很好!

编译时还会遇到其他一些错误。请记住putStrLnString为参数。您的fib函数返回Integer。您可以使用show将值转换为String

答案 1 :(得分:5)

总结一下:

  • 你的缩进看起来不错。
  • 函数名称不能以大写字母开头。大写标识符仅用于构造函数,类型和模块名称。
  • 您可以使用交互式口译员测试您的内容,而不需要主要功能。
  • 如果要存储某些计算的结果,则需要变量名称,因此getLine结果应绑定到index,而不是"index"。第一个是字符串变量,而不是字符串
  • putStrLn只接受一个参数(要显示的字符串)。在您的程序中,它会收到两个参数:函数Fib和一些未定义的x
  • 顺便说一句,您需要定义x,可能使用read将输入字符串转换为整数值。
  • 此外,putStrLn需要一个字符串而Fib返回一个整数,您需要在传递它之前对其进行转换:putStrLn (show (Fib x))

答案 2 :(得分: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需要String。所以我用print代替了。此外,您尝试使用字符串("index")作为变量。确实,你从String得到getLine,但它必须存储在一个变量中,而变量周围没有引号。

请注意,正如Barry所说,您并不真正需要main功能。只需将您的斐波纳契函数放入文件中,将其加载到ghci中并从那里调用该函数。容易腻。

另外,请注意你的斐波纳契功能非常缓慢,但我希望你已经意识到这一点。

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

IIRC,getLine返回一个字符串,因此您应该将其绑定到变量

do
   idx <- getLine
   print $ fib $ read idx