1

ダイクストラのアルゴリズムを実装するグラフを作成しており、次を含むファイルを読み取っています。

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

各ファイルにアクセスして、(a,a,float) と同じ ('1','4',5) のような配列に追加できるようにしたいと考えています。配列が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関数は、文字列を int のように読み取り、"1"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 に答える