我是Haskell的新手,但它似乎是一种我想要学习的强大语言。我在parsec上从现实世界的Haskell章节中采用了一些代码。我试着让我自己的版本解析uniprot文件的内容。这是一个由记录组成的文件(以">"开头),每个记录由行组成。我的代码看起来非常接近示例中的内容,但是我遇到了很多错误 - 主要是在类型上。我的例外是我正在使用readFile(IO字符串)而不是字符串的输出。如果有人能帮我理解我的做法有什么问题,我将不胜感激......
import Text.ParserCombinators.Parsec
main:: IO()
parseSprot :: IO String -> Either ParseError [[String]]
parseSprot input = parse uniprotFile "(unknown)" input
where
uniprotFile = endBy record eol
record = sepBy lines (char '>')
lines = many (noneOf ",\n")
eol = char '\n'
main = do
parseSprot $ readFile "uniprot_sprot.fasta"
putStrLn "hey"
答案 0 :(得分:2)
parseSprot
签名中不需要IO
。
parseSprot :: String -> Either ParseError [[String]]
...
readFile
的结果是IO String
。您可以通过将String
操作的结果绑定到新的readFile
操作,对此IO
执行某些操作。在do
表示法中,您可以将结果绑定到具有<-
main = do
fileContents <- readFile "uniprot_sprot.fasta"
parseSprot
函数不会在IO
中返回结果,您可以在任何地方使用它。在do
表示法中,我们通过使用不同的语法来区分绑定到变量的结果和声明之间的区别。 x <- ...
将结果绑定到变量。 let x = ...
声明x
是右侧的任何内容。
main = do
fileContents <- readFile "uniprot_sprot.fasta"
let parsedContents = parseSprot fileContents
要测试解析器的功能,您可能需要print
parse
返回的值。
main = do
fileContents <- readFile "uniprot_sprot.fasta"
let parsedContents = parseSprot fileContents
print parsedContents
如果没有do
表示法,您可以将其写为
main = readFile "uniprot_sprot.fasta" >>= print . parseSprot
>>=
获取第一次计算的结果并将其输入函数以决定下一步该做什么。