如何使用parsec解析uniprot文件?

时间:2015-03-31 23:36:40

标签: haskell

我是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"

1 个答案:

答案 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

>>=获取第一次计算的结果并将其输入函数以决定下一步该做什么。