我正在尝试运行此代码:
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 `='
由于
答案 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
进行编译或与ghc
或runghc
一起运行的Haskell runhaskell
文件中,您无需使用let
来定义价值观和功能。所以你应该这样做:
test = ...
candidate = ...
calculate = ...
在do
块中,或者当使用实际运行代码的解释器时,就好像它是在do
块中编写的一样,无论何时定义值和函数,都应该使用{{1关键字。因此,在let
块内或do
会话中,您可以执行
ghci
最后请注意,在更大的定义中使用临时值时,您可以在let test = ...
let candidate = ...
let calculate = ...
块或let
会话之外使用关键字do
,例如:
ghci