在Haskell中解析输入文件文件

use*_*057 3 string haskell file input

在Haskell中是否有任何快速方法将类似的输入文件转换为相应的类型?例如,一个接受字符串并生成Ints 列表的函数?或者我需要手动解析它getLine并解析字符串?

10.
10.
[4, 3, 2, 1].
[(5,8,'~'), (6,4,'*'), (7,10,'~'), (8,2,'o')].
[4,0,9,4,7,5,7,4,6,4].
[4,10,0,6,6,5,6,5,6,2].
Run Code Online (Sandbox Code Playgroud)

Jef*_*rka 6

是的,read功能.

readFile例如,一旦读入文件,就可以将read每行转换为所需的类型.不过,你必须首先摆脱这些时期.例如:

main = do
    text <- readFile "test.txt"
    let cases = lines text
        -- to get rid of the periods at the end of each line
        strs = map init cases
        lastLine = read $ last strs
    print $ show (map (+5) lastLine)
Run Code Online (Sandbox Code Playgroud)

这将获取您的示例文件,并Int从最后一行的s 列表中读取,并将5添加到整个列表并打印它.

如果每一行都是相同的类型,你可以map read在所有行上获得所有行.如果有不同的类型,比如在您的示例中,您必须输入一些逻辑来确定每行上的类型,然后调用适当的函数来处理该类型.


Gab*_*lez 5

在Jeff Burka的答案的基础上,这是您将用于特定文件的特定代码:

main = do
    [l1, l2, l3, l4, l5, l6] <- fmap (map init . lines) $ readFile "myFile.txt"
    let myVal :: (Int, Int, [Int], [(Int, Int, Char)], [Int], [Int])
        myVal = (read l1, read l2, read l3, read l4, read l5, read l6)
    print myVal
Run Code Online (Sandbox Code Playgroud)

这将打印出已解析的元组.

init部分是为了摆脱每一行末尾的尾随时期.