尝试运行以下代码时,输入'='时出现解析错误
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)
答案 0 :(得分:1)
要回答您的问题:,因为您的代码存在语法错误。
其他一些评论:
使用单个代码文件时,您不需要module
。 module
用于编写库。
main :: IO ()
中的绑定需要let
,因为它位于IO Monad
中。详细了解do
here
仅设置stdin
缓冲模式就足够了。
Prelude中有sum个功能。
我尝试使代码尽可能接近原始代码。但是,这不是好的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)]。