为什么我在输入'='Haskell上得到解析错误

时间:2017-04-25 02:38:03

标签: haskell

尝试运行以下代码时,输​​入'='时出现解析错误

module GiveNums
  where
import System.IO

main = do
  hSetBuffering stdin LineBuffering
  n <- giveNum
  sum = map (+) n
  putStrLn "The sum is " ++ show sum

giveNum = do
  hSetBuffering stdin LineBuffering
  putStrLn "Enter num"
  num <- getLine
  if read num == 0
    then return []
  else do
   rest <- giveNum
   return ((read num :: Int: rest)

2 个答案:

答案 0 :(得分:1)

要回答您的问题:,因为您的代码存在语法错误。

其他一些评论:

  1. 使用单个代码文件时,您不需要modulemodule用于编写库。

  2. main :: IO ()中的绑定需要let,因为它位于IO Monad中。详细了解do here

  3. 仅设置stdin缓冲模式就足够了。

  4. Prelude中有sum个功能。

  5. 我尝试使代码尽可能接近原始代码。但是,这不是好的Haskell代码。

    import System.IO
    
    main :: IO ()
    main = do
      hSetBuffering stdin LineBuffering
      n <- giveNum
      let summation = sum n
      putStrLn $ "The sum is " ++ show summation
    
    giveNum :: IO [Int]
    giveNum = do
      putStrLn "Enter num"
      num <- read <$> getLine
    
      if num == 0
        then return []
        else do
             rest <- giveNum
             return $ num: rest
    

    输出:

    $ runhaskell givenum.hs 
    Enter num
    1
    Enter num
    2
    Enter num
    3
    Enter num
    0
    The sum is 6
    

答案 1 :(得分:0)

因为如果你想&#34;分配&#34;在do语句中需要将let置于其前面,因此sum = map (+) n变为let sum = map (+) n,但正如wizzup所指出的,sum已被定义为标准函数,并且{{1} }不会返回let sum = map (+) n中的整数之和,因为你需要foldr

n

但是let sumOfn = foldr (+) 0 n会更容易 此外,let sumOfn = sum n创建类型为let f =map (+) n的函数列表,如果n为[1,2,3],则f为[(+1),(+ 2),(+ 3)]。