簡體   English   中英

為什么在此 Haskell 代碼中出現解析輸入錯誤?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM