Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Haskell中读取文件时出现问题_Haskell - Fatal编程技术网

在Haskell中读取文件时出现问题

在Haskell中读取文件时出现问题,haskell,Haskell,我是Haskell的新手,我很难从文件中读取文本和数字。我正在尝试制作一个程序,读取大量的数字和文本并进行比较,我想知道如何将它们读入一个列表,这样比较起来就更容易了,我想 假设我有一个包含以下内容的文件: File 1: Bill 9176 Tom 9183 Steve 4353 我想把名字和号码读入一个列表,我怎么能做到 当我试图编译这段代码时 import Text.Parsec import Text.Parsec.String parseNameNumber :: Pa

我是Haskell的新手,我很难从文件中读取文本和数字。我正在尝试制作一个程序,读取大量的数字和文本并进行比较,我想知道如何将它们读入一个列表,这样比较起来就更容易了,我想

假设我有一个包含以下内容的文件:

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->部分是您可以使用解析结果的地方。