Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell中的图变换_Haskell_Graph_Functional Programming - Fatal编程技术网

Haskell中的图变换

Haskell中的图变换,haskell,graph,functional-programming,Haskell,Graph,Functional Programming,我试图理解这段代码是如何转换文件的 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

我试图理解这段代码是如何转换文件的

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
有人能给我描述一下代码运行后数据的样子吗 这是一张单子吗?或者是什么

我认为这里的重点是

readGraph = transpose . str2int . map words . lines

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

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

映射单词。因此,行
将输入字符串转换为字符串列表。根据您的输入,这将是一个按行主要顺序排列的字符串矩阵

函数将字符串列表转换为
Int
,并将每个元素转换为
Int
,然后将任何零转换为“无穷大”
(1/0)

str2int。映射单词。因此,行
读取输入矩阵并将所有元素转换为数字类型

转换其参数的行和列,所以这只是将输入矩阵转换为列主顺序


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

按换行符拆分输入字符串

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

映射单词。因此,行
将输入字符串转换为字符串列表。根据您的输入,这将是一个按行主要顺序排列的字符串矩阵

函数将字符串列表转换为
Int
,并将每个元素转换为
Int
,然后将任何零转换为“无穷大”
(1/0)

str2int。映射单词。因此,行
读取输入矩阵并将所有元素转换为数字类型

转换其参数的行和列,所以这只是将输入矩阵转换为列主顺序


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

好的,您可以先以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
modulemain其中
导入数据。列表
readGraph=转置。str2int。映射单词。线
zero2inf x=如果x==0,则为1/0,否则为x
str2int=map.map$zero2inf。从积分。(\xs->read xs::Int)
main::IO()
main=do

contents好的,您可以先以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
modulemain其中
导入数据。列表
readGraph=转置。str2int。映射单词。线
zero2inf x=如果x==0,则为1/0,否则为x
str2int=map.map$zero2inf。从积分。(\xs->read xs::Int)
main::IO()
main=do
内容以下是步骤

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]]
zero2inf::(数值a,等式a,分数a)=>a->a
(\xs->读取xs::Int)::字符串->Int
fromIntegral.::Num a=>String->a
zero2inf.:(数值a,等式a,分数a)=>字符串->a
映射::(数值a,等式a,分数a)=>[String]->[a]
映射::(数值a,等式a,分数a)=>[[String]]->[[a]]
str2int=
行::字符串->[String]
单词::字符串->[String]
转置::[[a]]->[[a]]
映射词::[String]->[[String]]
映射单词。行::字符串->[[String]]
str2int.::(数值a,分数a,等式a)
=>字符串->[[a]]
转置:(数值a,分数a,等式a)
=>字符串->[[a]]
readFile::String->IO字符串
读取文件“graph.txt”::IO字符串
做内容[[a]]
以下是步骤

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]]
zero2inf::(数值a,等式a,分数a)=>a->a
(\xs->读取xs::Int)::字符串->Int
fromIntegral.::Num a=>String->a
zero2inf.:(数值a,等式a,分数a)=>字符串->a
映射::(数值a,等式a,分数a)=>[String]->[a]
映射::(数值a,等式a,分数a)=>[[String]]->[[a]]
str2int=
行::字符串->[String]
单词::字符串->[String]
转置::[[a]]->[[a]]
映射词::[String]->[[String]]
映射单词。行::字符串->[[String]]
str2int.::(数值a,分数a,等式a)
=>字符串->[[a]]
转置:(数值a,分数a,等式a)
=>字符串->[[a]]
readFile::String->IO字符串
读取文件“graph.txt”::IO字符串
做内容[[a]]

我只是想知道图形的实际表示方式,它是一个列表列表。。。像这样的


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

我只是想知道图形的实际表示方式,它是一个列表列表。。。像这样的


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

尝试在GHCi中使用此代码,并在每个步骤中检查类型<代码>:t
(在GHCi中)是您的朋友。请尝试在GHCi中使用此代码,并在每个步骤中检查类型<代码>:t
(在GHCi中)是你的朋友。