[英]Why do I get parse input error in this Haskell code?
代碼的輸入是用“一”“二”等字寫的數字。output 是輸入“和”或“結束”時輸入的所有數字的總和。 “end”也退出程序。
這是我寫的代碼。
main = addfunc 0
addfunc :: Int -> IO ()
addfunc l = do
{
input <- getLine;
let n = myStrToI input
; if n == -2
then do {
putStrLn("The final sum is: " ++ show (l));
return ();
}
else if n == -1
then
putStrLn("The current sum is: " ++ show(l));
addfunc l; <--Error Here
else addfunc (n+l)
}
myStrToI :: [Char] -> Int
myStrToI l
| l == "zero" = 0
| l == "one" = 1
| l == "two" = 2
| l == "three" = 3
| l == "four" = 4
| l == "five" = 5
| l == "six" = 6
| l == "seven" = 7
| l == "eight" = 8
| l == "nine" = 9
| l == "sum" = -1
| l == "end" = -2
我得到的錯誤是
"error: parse error on input 'addfunc'
17. addfunc l;"
我試過改變空格的數量或刪除';' 在上面的行中,但我仍然在那個地方遇到錯誤。 這個錯誤是因為 if else 塊的縮進嗎? 我是 Haskell 的初學者,並不太明白錯誤在哪里。
如果您使用{
}
(您可能不應該這樣做),那么確實會禁用內部的所有縮進敏感性。 所以你的代碼解析就像
addfunc :: Int -> IO ()
addfunc l = do
{
input <- getLine;
let n = myStrToI input;
if n == -2
then do {putStrLn("The final sum is: " ++ show (l)); return ()}
else if n == -1
then putStrLn("The current sum is: " ++ show(l));
addfunc l
else addfunc (n+l)
}
那么編譯器是怎么做的呢? 好吧,讓我們也移動一下分號:
addfunc :: Int -> IO ()
addfunc l = do
{ input <- getLine
; let n = myStrToI input
; if n == -2
then do {putStrLn("The final sum is: " ++ show (l)); return ()}
else if n == -1
then putStrLn("The current sum is: " ++ show(l))
; addfunc l
else addfunc (n+l)
}
哎呀。 if n == -1
永遠不會完成,而是跳到最外面的do
塊中的下一行,然后那里有一個單獨的else
。
你真正需要的是另一個為if
分支do
的事情。 最好使用不帶括號的縮進:
addfunc :: Int -> IO ()
addfunc l = do
input <- getLine
let n = myStrToI input
if n == -2
then do
putStrLn("The final sum is: " ++ show (l))
return ()
else if n == -1
then do
putStrLn $ "The current sum is: " ++ show l
addfunc l
else
addfunc (n+l)
實際上,我更喜歡使用case
構造而不是那些if
s:
...
let n = myStrToI input
case n of
-2 -> do
putStrLn("The final sum is: " ++ show (l))
return ()
-1 -> do
putStrLn $ "The current sum is: " ++ show l
addfunc l
_ ->
addfunc (n+l)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.