Haskell简单编译bug

时间:2010-03-08 21:35:12

标签: haskell

我正在尝试运行此代码:

let coins = [50, 25, 10, 5, 2,1]

let candidate = 11

calculate :: [Int]
calculate = [ calculate (x+candidate) | x <- coins, x > candidate]

我已经阅读了一些教程,结果还可以。 我正在尝试解决一些小问题,让我对语言有所了解。但是我坚持这个。

test.hs:3:0: parse error (possibly incorrect indentation)

谁能告诉我为什么?我今天开始使用haskell,所以请轻松解释。

我试过像以下那样运行它:

runghc test.hs
ghc test.hs

但是:

ghci < test.hs

它给出了这个:

<interactive>:1:10: parse error on input `='

由于

3 个答案:

答案 0 :(得分:5)

1)顶级声明不需要'let'。你可能想要:

coins = [50, 25, 10, 5, 2,1]

candidate = 11

2)计算明确地作为列表输入并用作函数。

这里是你说calculate是一个整数列表:

calculate :: [Int]

在列表理解中你使用了calculate (x+candidate),但是你已经明确地计算了一个列表而不是一个函数 - 所以这不起作用。

calculate = [ calculate (x+candidate) | x <- coins, x > candidate]

也许你想要这样的东西:

newCoins = [ x + candidate | x <- coins, x > candidate]

如果您更多地了解了您想要的结果,那将会有所帮助。

答案 1 :(得分:3)

我对haskell也很陌生,但这是我到目前为止收集的内容

在ghci中,你不能定义一个函数没有 let

.hs文件中,您无法使用 let

定义功能

答案 2 :(得分:1)

使用let很棘手。在您打算使用.hs进行编译或与ghcrunghc一起运行的Haskell runhaskell文件中,您无需使用let来定义价值观和功能。所以你应该这样做:

test = ...
candidate = ...
calculate = ...

do块中,或者当使用实际运行代码的解释器时,就好像它是在do块中编写的一样,无论何时定义值和函数,都应该使用{{1关键字。因此,在let块内或do会话中,您可以执行

ghci

最后请注意,在更大的定义中使用临时值时,您可以在let test = ... let candidate = ... let calculate = ... 块或let会话之外使用关键字do,例如:

ghci