1

我正在构建一个图来实现 Dijkstra 的算法,并且我正在读取一个包含

1 3 5
1 2 6

我将如何读取每一行并将其存储为 [(a,a,float)]。我需要这个才能使用:

buildGraph :: Ord a => [(a, a, Float)] -> Map a [(a, Float)]

这是我构建图表的方式:

let g =  buildGraph [('a','c',2), ('a','d',6), ('b','a',3)
                         ,('b','d',8), ('c','d',7), ('c','e',5)
                         ,('d','e',10)]

目前我可以读取文件并将所有内容存储在数组中。

main = do
    contents <- readFile "input.txt"

     print . map readInt . words $ contents


readInt :: String -> Int
readInt = read

我希望能够访问每个文件并附加到一个像这样的数组('1','4',5),这与(a,a,float)相同。在数组准备好发送到 buildGraph 之后

Type Edge = (Char, Char, Float)
readGraphFile :: FilePath -> IO Edge
readGraphFile path = do
                    alldata <- readFile path
                    return (Char,Char,Float)
4

1 回答 1

4

这是基于您提供的代码的内容:

import qualified Data.Char as Char -- good practice to import modules qualified

main = do contents <- readFile "input.txt"
          print . map (f . words) $ lines contents
        where
          -- this will break if your input file is badly formed!
          f [a,b,c] = (readChar a, readChar b, readFloat c)

readChar :: String -> Char
readChar c = Char.chr (64 + read c)

readFloat :: String -> Float
readFloat = read

readChar函数读取一个类似"1"int 的字符串,然后添加 64(将其带入 ascii 字母数字范围)并使用该函数Char.chr将其转换为字符。

您可以将类型更改readChar为例如readOrd :: (Read a, Ord a) => String -> a以阅读更通用的内容。

当然,除了打印它们(例如将它们发送到buildGraph)之外,您还必须对这些值做一些事情,否则运行时将无法推断出Read ∩ Ord您想要哪个交集实例。

这将读取文件input.txt,如下所示:

1 2 4.5
1 3 6.0
3 2 1.2

并输出

ghci> main
[('A','B',4.5), ('A','C',6.0), ('C','B',1.2)]
于 2013-03-05T08:11:52.573 回答