0

我试图了解此代码如何转换文件

contents <- readFile "graph.txt"
let graph = readGraph contents

readGraph = transpose . str2int . map words . lines
str2int = map.map $ zero2inf . fromIntegral . (\xs -> read xs :: Int)
zero2inf x = if x == 0 then 1/0 else x

实际的txt文件有以下信息

0  0  0  0  0
8  0  0  0  0
15 13 0  0  0
9  1  8  0  0
1  9  6  1  0

有人可以给我描述一下代码运行后数据的样子吗?它是一个列表吗?或者它是什么?

我认为这里的重要线路是

readGraph = transpose . str2int . map words . lines
4

4 回答 4

4

以下是步骤。

zero2inf :: (Num a, Eq a, Fractional a) => a -> a

(\xs -> read xs  :: Int) :: String -> Int
fromIntegral . <prev>    :: Num a => String -> a
zero2inf . <prev>        :: (Num a, Eq a, Fractional a) =>   String   ->   a
map <prev>               :: (Num a, Eq a, Fractional a) =>  [String]  ->  [a]
map <prev>               :: (Num a, Eq a, Fractional a) => [[String]] -> [[a]]
str2int = <prev>

lines                    :: String -> [String]
words                    :: String -> [String]
transpose                :: [[a]] -> [[a]]
map words                :: [String] -> [[String]]
map words . lines        :: String -> [[String]]
str2int . <prev>         :: ( Num a, Fractional a, Eq a )
                            => String -> [[a]]
transpose . <prev>       :: ( Num a, Fractional a, Eq a )
                            => String -> [[a]]

readFile                 :: String -> IO String
readFile "graph.txt"     :: IO String

do contents <- readFile "graph.txt"
   readGraph (contents :: String) :: ( Num a, Fractional a, Eq a ) => [[a]]
于 2013-11-06T20:33:54.320 回答
0

lines在换行符上拆分输入字符串

words在空格上拆分输入字符串因此map words是将字符串列表转换为每个字符串中单词列表的函数

map words . lines因此将输入字符串转换为字符串列表。给定您的输入,这将是一个以行为主的字符串矩阵。

您的str2int函数转换字符串列表并将每个元素转换为 anInt然后将任何零转换为 'infinity' (1/0)

str2int . map words . lines因此读取输入矩阵并将所有元素转换为数值类型

Data.List.transpose转置其参数的行和列,因此这只是将输入矩阵转置为列优先顺序。

readGraph因此读取包含以行优先顺序排列的矩阵的输入字符串,并将其转换为Double以列优先顺序排列的 s 矩阵。

于 2013-11-06T20:18:04.497 回答
0

好吧,您可以从编写由 ghc 运行和编译的代码开始,如下所示:

module Main where

import Data.List

readGraph = transpose . str2int . map words . lines

zero2inf x = if x == 0 then 1/0 else x

str2int = map.map $ zero2inf . fromIntegral . (\xs -> read xs :: Int)
main :: IO ()
main = do
    contents <- readFile "graph.txt"
    print $ readGraph contents

但除此之外,使用hoogle来查看每个函数的readGraph作用。lines根据换行符的位置将字符串分解为列表,然后words映射到列表上以根据空格的位置将每行整数分解为单独的整数,str2int将表示整数的每个字符串转换为实际的整数类型,以及最后transpose(像典型的矩阵转置)交换结果整数矩阵的所有行和列。

于 2013-11-06T20:19:21.987 回答
0

我只是想知道图形的实际表示是如何的,它是一个列表列表......像这样

[[1/0,2,5],[2,1/0,6],[5,6,1/0]]

于 2013-11-18T21:08:00.567 回答