在Haskell中读取文件时出现问题
我是Haskell的新手,我很难从文件中读取文本和数字。我正在尝试制作一个程序,读取大量的数字和文本并进行比较,我想知道如何将它们读入一个列表,这样比较起来就更容易了,我想 假设我有一个包含以下内容的文件:在Haskell中读取文件时出现问题,haskell,Haskell,我是Haskell的新手,我很难从文件中读取文本和数字。我正在尝试制作一个程序,读取大量的数字和文本并进行比较,我想知道如何将它们读入一个列表,这样比较起来就更容易了,我想 假设我有一个包含以下内容的文件: File 1: Bill 9176 Tom 9183 Steve 4353 我想把名字和号码读入一个列表,我怎么能做到 当我试图编译这段代码时 import Text.Parsec import Text.Parsec.String parseNameNumber :: Pa
File 1:
Bill 9176
Tom 9183
Steve 4353
我想把名字和号码读入一个列表,我怎么能做到
当我试图编译这段代码时
import Text.Parsec
import Text.Parsec.String
parseNameNumber :: Parser (String, Integer)
parseNameNumber = do
spaces
name <- many1 letter
space
number <- fmap read $ many1 digit
return (name, number)
parseFile :: String -> IO ()
parseFile = do
result <- parseFromFile (parseNameNumber `sepBy` newline)
case result of
Left err -> print err
Right res -> print res
它给了我这些错误:
Couldn't match type `IO ()' with `String -> IO ()'
Expected type: IO (Either a0 a1)
-> (Either a0 a1 -> IO ()) -> String -> IO ()
Actual type: IO (Either a0 a1)
-> (Either a0 a1 -> IO ()) -> IO ()
In a stmt of a 'do' block:
result <- parseFromFile (parseNameNumber `sepBy` newline)
In the expression:
do { result <- parseFromFile (parseNameNumber `sepBy` newline);
case result of {
Left err -> print err
Right res -> print res } }
In an equation for `parseFile':
parseFile
= do { result <- parseFromFile (parseNameNumber `sepBy` newline);
case result of {
Left err -> print err
Right res -> print res } }
file.hs:14:13:
Couldn't match expected type `IO (Either a0 a1)'
with actual type `String
-> IO (Either ParseError [(String, Integer)])'
In the return type of a call of `parseFromFile'
Probable cause: `parseFromFile' is applied to too few arguments
In a stmt of a 'do' block:
result <- parseFromFile (parseNameNumber `sepBy` newline)
In the expression:
do { result <- parseFromFile (parseNameNumber `sepBy` newline);
case result of {
Left err -> print err
Right res -> print res } }
看看你的数据
"Bill 9176" :: String
现在回到你的元组
("Bill", 9176) :: (String, Int)
现在回到你的数据。遗憾的是,它不是一个元组。但是有一些纯函数,它可能是你想要的类型。向下看,向后看。你在哪?你们在计算机屏幕前,在终端上运行vim。阅读的类型是什么
回到弦上。您可以用单词拆分字符串
当函数是数据,而数据是函数时,任何事情都是可能的。我住在单间
parseLine :: String -> (String, Int)
parseLine xs = (\(n:i:_) -> (n, read i)) (words xs)
看看你的数据
"Bill 9176" :: String
现在回到你的元组
("Bill", 9176) :: (String, Int)
现在回到你的数据。遗憾的是,它不是一个元组。但是有一些纯函数,它可能是你想要的类型。向下看,向后看。你在哪?你们在计算机屏幕前,在终端上运行vim。阅读的类型是什么
回到弦上。您可以用单词拆分字符串
当函数是数据,而数据是函数时,任何事情都是可能的。我住在单间
parseLine :: String -> (String, Int)
parseLine xs = (\(n:i:_) -> (n, read i)) (words xs)
听起来您的问题是解析,而不是读取文件。我喜欢使用名为Parsec的Haskell库进行解析。它可以与cabal install parsec一起安装。然后
当然,这可以通过使用列表操作操作字符串,然后应用read来实现,但它的健壮性要差得多。也许这太过分了,但我还是要说这是值得学习的。听起来你的问题是解析,而不是读取文件。我喜欢使用名为Parsec的Haskell库进行解析。它可以与cabal install parsec一起安装。然后
当然,这可以通过使用列表操作操作字符串,然后应用read来实现,但它的健壮性要差得多。也许这太过分了,但我还是要说这是值得学习的。也许你应该从学习一些基本的哈斯克尔开始。例如,阅读这本书@RomanCheplyaka我知道如何使用getContents阅读,但我不知道的是如何将数据读入Tuples你尝试过什么?如果可以使用getContents获取内容,那么如何将其分隔成行?提示:键入:在GHCi中键入行。一旦你有了每一行,你如何将这一行转换成文字?提示:键入:在GHCi中键入单词。长错误消息是因为缺少parseFromFile的filename参数。在错误消息中有一个建议。也许你应该从学习一些基本的Haskell开始。例如,阅读这本书@RomanCheplyaka我知道如何使用getContents阅读,但我不知道的是如何将数据读入Tuples你尝试过什么?如果可以使用getContents获取内容,那么如何将其分隔成行?提示:键入:在GHCi中键入行。一旦你有了每一行,你如何将这一行转换成文字?提示:键入:在GHCi中键入单词。长错误消息是因为缺少parseFromFile的filename参数。在错误消息中有一个建议。但是如果它使用纯函数,如果你想坚持oldspice主题,它可能会变成一个元组:所以基本上如果我想读取一个文件而不是一个元组,我如何调整这个函数?但如果它使用纯函数,它可能会变成一个元组如果你想坚持oldspice主题:那么基本上,如果我想读取一个文件而不是一个元组,我如何调整这个函数?我正在试着编译你的代码,以便尝试一下,但它给了我很多errors@user3028943你介意告诉我这些错误是什么吗?它为mei编译并将其放入一个新的答案中:@jozefg对不起,如果我想使用这些程序从文件中读取某些内容,我该怎么做?@dcarou表示parseFile获取文件并对其进行解析的函数。。条件语句中的Right res->部分是你可以使用解析结果的地方。我正试图编译你的代码,以便尝试一下,但它给了我很多errors@user3028943你介意告诉我这些错误是什么吗?它为mei编译并将其放入一个新的答案中:@jozefg对不起,如果我想使用这些程序从文件中读取某些内容,我该怎么做?@dcarou表示parseFile获取文件并对其进行解析的函数。。条件的右res->部分是您可以使用解析结果的地方。