haskell tls 文件到列表列表

haskell tls file to list of list

我有一个 tls 文件,例如:

1224    926 1380    688 845 109 118 88  1275    1306    91  796 102 1361    27  995
1928    2097    138 1824    198 117 1532    2000    1478    539 1982    125 1856    139 475 1338
848 202 1116    791 1114    236 183 186 150 1016    1258    84  952 1202    988 866
946 155 210 980 896 875 925 613 209 746 147 170 577 942 475 850
1500    322 43  95  74  210 1817    1631    1762    128 181 716 171 1740    145 1123
3074    827 117 2509    161 206 2739    253 2884    248 3307    2760    2239    1676    1137    3055
183 85  143 197 243 72  291 279 99  189 30  101 211 209 77  198
175 149 259 372 140 250 168 142 146 284 273 74  162 112 78  29
169 578 97  589 473 317 123 102 445 217 144 398 510 464 247 109
3291    216 185 1214    167 495 1859    194 1030    3456    2021    1622    3511    222 3534    1580
2066    2418    2324    93  1073    82  102 538 1552    962 91  836 1628    2154    2144    1378
149 963 1242    849 726 1158    164 1134    658 161 1148    336 826 1303    811 178
3421    1404    2360    2643    3186    3352    1112    171 168 177 146 1945    319 185 2927    2289
543 462 111 459 107 353 2006    116 2528    56  2436    1539    1770    125 2697    2432
1356    208 5013    4231    193 169 3152    2543    4430    4070    4031    145 4433    4187    4394    1754
5278    113 4427    569 5167    175 192 3903    155 1051    4121    5140    2328    203 5653    3233

如何在 haskell 中的 int 列表列表中读取它?

我尝试了几个选项,但我无法做到。我是 haskell 的新手,所以请耐心等待。

  • 首先使用 lines:

    将您的输入分成几行
    let test = "1 2 3 4\n 5 6 7 \n 4 2 5"
    let rows = lines test --literally "lines test"! Beautiful, eh?
    

    结果:

    ["1 2 3 4"," 5 6 7 "," 4 2 5"] :: [[Char]]
    
  • 然后,使用 words:

    将单个数字提取为字符串
    let nums_as_strings = map words rows
    

    结果:

    [["1","2","3","4"],["5","6","7"],["4","2","5"]] :: :: [[[Char]]]
    
  • 最后要做的是使用 read:

    将这些字符串转换为整数
    let numbers = map (map read) nums_as_strings :: [[Int]]
    

    结果:

    [[1,2,3,4],[5,6,7],[4,2,5]] :: [[Int]]
    

或者,压缩成一行:

let numbers = map (map read) (map words $ lines test) :: [[Int]]

您的数据示例:

Prelude> let test = "1224    926 1380    688 845 109 118 88  1275    1306    91  796 102 1361    27  995\n1928    2097    138 1824    198 117 1532    2000    1478    539 1982    125 1856    139 475 1338"
Prelude> map (map read) (map words $ lines test) :: [[Int]]
[[1224,926,1380,688,845,109,118,88,1275,1306,91,796,102,1361,27,995],[1928,2097,138,1824,198,117,1532,2000,1478,539,1982,125,1856,139,475,1338]]

您可能需要处理空行,但这真的很简单。

import System.IO

readListOfLists :: Handle -> IO [[Int]]
readListOfLists handle = do 
    contents <- hGetContents handle
    let ls :: [String] 
        ls = lines contents
        ws :: [[String]]
        ws= map words ls
        res :: [[Int]]
        res = map (map read) ws
    return res;  

或者您可以在一行中编写相同的代码:

readListOfLists :: Handle -> IO [[Int]]
readListOfLists = fmap (map (map read . words) . lines) . hGetContents 

使用方法:

do
    handle <- openFile fileName ReadMode
    table <- readListOfLists handle
    hClose handle 
    print table