我正在研究第二个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似乎想把所有东西放在一行,所以我必须把它全部分开。抱歉。
答案 0 :(得分:8)
Fib的第一个字母不应大写。大写单词表示类型。函数应以小写字母开头。
编译看起来很好!
编译时还会遇到其他一些错误。请记住putStrLn
以String
为参数。您的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