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

さて、次のように、実行して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

しかし、それ以外にも、hogleを使用して、個々の関数が何を行っているかを確認してくださいreadGraphlines改行文字の位置に基づいて文字列をリストに分割し、リストにwordsマッピングして、スペースの位置に基づいて整数の各行を個別の整数に分割しstr2int、整数を表す各文字列を実際の整数型に変換します。最後にtranspose(典型的な行列の転置のように) 結果の整数行列のすべての行と列を交換します。

于 2013-11-06T20:19:21.987 に答える