【问题标题】:Why am I getting a parse error on input '=' Haskell为什么我在输入“=” Haskell 时收到解析错误
【发布时间】:2017-04-25 02:38:02
【问题描述】:

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

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)

【问题讨论】:

  • 简而言之:因为这不是合法的 Haskell 语法。更长:绑定变量为let var = expr。另外:map (+) n 不会给出一个数字,而是一个函数列表,你可能想要折叠。另外:f x :: ty : xs 无法正确解析,您需要 (f x :: ty) : xs) 等括号。
  • 另外sum 已经被当作变量名,它是一个函数的名字。在 ghci 中执行 :t sum:i sum,或搜索它。我建议您暂时注释掉您的 main 函数并让您的 giveNum 函数正常工作。这真的很接近工作,尤其是托马斯的最后一个建议。然后,一旦giveNum 工作,从main 开始。
  • 喜欢,非常接近。就像,离工作还有一个角色。

标签: haskell


【解决方案1】:

回答你的问题:因为你的代码有语法错误。

一些额外的 cmets:

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

  2. main :: IO () 中的绑定需要let,因为它在IO Monad 中。阅读更多关于dohere

  3. 设置stdin缓冲模式一次就够了。

  4. 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

【讨论】:

    【解决方案2】:

    因为如果你想在 do 语句中“分配”某些东西,你需要在它前面加上 let,所以 sum = map (+) n 变成了 let sum = map (+) n,但是正如 wizzup 指出的那样, sum 已经被定义为一个标准函数并且let sum = map (+) n 也不会返回 n 中的整数和,因为你需要 foldr

    let sumOfn = foldr (+) 0 n

    但这样做会更容易let sumOfn = sum n 此外,let f =map (+) n 创建了一个 Int-&gt;Int 类型的函数列表,如果 n 是 [1,2,3] 那么 f 是 [(+1),(+2),(+3)]。

    【讨论】:

      猜你喜欢
      • 2020-06-12
      • 2013-06-04
      • 2022-06-11
      • 1970-01-01
      • 2013-01-28
      • 2021-11-06
      • 2020-04-17
      • 2016-01-11
      • 2014-02-07
      相关资源
      最近更新 更多