List &引用;前奏曲:无解析“;在Haskell中使用列表时

List &引用;前奏曲:无解析“;在Haskell中使用列表时,list,haskell,integer,boolean,head,List,Haskell,Integer,Boolean,Head,我对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 >>

我对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

我还尝试了在没有整数列表的情况下使用它,但效果很好。

我猜您是在CLI中以
程序10[7,3,5,4,4]
的形式运行该程序

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

尝试将列表中的每个字符串作为整数进行分析会因为附加字符而失败

你应该选择一种更好的方法来传递参数。我建议您选择
程序10735444
程序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)
main::IO()
main=do

[strN,strNs]我想你也可以做如下事情

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

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

无法编译:它定义了两次
函数
。对了,我的错,修好了,我明白了,谢谢。当我去掉括号和逗号时,它工作得很好。问题是,我们只需要改变相同的函数。如何处理以这种语法给出的列表?如果无法更改
main
,则输入必须没有额外字符。仔细检查你的练习文本。可能示例
10[1,…]
不是要从CLI调用程序,而是直接(例如从GHCi调用)输入
函数。(顺便说一句,我建议你在长度为0、1、2、3的列表中检查你的程序,看看它是否正常工作。)我认为你是对的。在示例中,它们只是将参数直接输入到同一个函数中。如何在CLI中执行此操作?@dYTe您不能直接从CLI执行此操作。相反,从那里运行
ghci YourFile.hs
,然后您将得到一个提示,您可以从中评估
函数args
。非常感谢,您帮助了很多:)