【问题标题】:"Prelude.read: no parse" when working with list in Haskell在 Haskell 中使用列表时“Prelude.read: no parse”
【发布时间】:2017-09-28 23:05:42
【问题描述】:

我对 Haskell 很陌生,并且很难在这里看到我的错误:

same :: Integer -> [Integer] -> Bool
same n xs = if head xs == n
                then True
                else False

function :: [Integer] -> Bool
function (n:xs) = same n xs

main :: IO ()
main = getArgs >>= putStrLn . show . function . (map read)

它编译得很好,但是当我用它运行它时

10 [7, 3, 5, 4, 4]

例如作为参数,我得到

Prelude.read: no parse

我也试过不带整数列表,它工作得很好。

【问题讨论】:

  • 无法编译:它定义了两次function
  • 对,我的错,已修复

标签: list haskell integer boolean head


【解决方案1】:

我猜你是从 CLI 以program 10 [7, 3, 5, 4, 4] 运行程序。

在这种情况下,getArgs 返回列表["10", "[7,", "3,", "5,", "4,", "4]"]

由于额外的字符,尝试将列表中的每个字符串解析为整数都会失败。

您应该选择一种更好的方式来传递参数。我建议program 10 7 3 5 4 4program 10 "[7, 3, 5, 4, 4]"。第一个传递了许多参数,第二个只有两个(第二个是包含整个列表的字符串)。无论您选择什么,都应该相应地调整您的代码。

这是一个例子。

main :: IO ()
main = do
   [strN, strNs] <- getArgs
   let n = read strN
       ns = read strNs
   putStrLn $ "Numeric arg: " ++ show n
   putStrLn $ "List arg, incremented: " ++ show (map succ ns)

从 CLI 以 program 10 "[1, 4, 7]" 调用它应该可以工作。

【讨论】:

  • 啊,我明白了,谢谢。当我删除括号和逗号时,它工作得很好。问题只是,我们只应该改变相同的功能。以这种语法给出的列表,我该如何处理?
  • 如果无法更改main,则输入必须没有多余的字符。仔细检查你的练习文本。也许示例 10 [1, ...] 并不是来自 CLI 的程序调用,而是直接输入到 function,例如通过从 GHCi 调用它。 (顺便说一句,我建议在长度为 0、1、2、3 的列表上检查您的程序,看看它是否正常工作。)
  • 我认为你是对的。在示例中,他们只是直接将参数输入到相同的函数中。如何在 CLI 中执行此操作?
  • @dYTe 您不能直接从 CLI 中获取。相反,从那里运行ghci YourFile.hs,然后您将收到一个提示,您可以从中评估function args
  • 非常感谢,你帮了很多忙:)
【解决方案2】:

我猜你也可以这样做;

firstEqualSecond :: [Int] -> Bool
firstEqualSecond (f:s:_) = f == s

pgm :: IO ()
pgm = getArgs >>= \(a:b:_) -> (putStrLn.show.firstEqualSecond) (read a:read b)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    • 2017-01-18
    • 1970-01-01
    • 2021-12-21
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多