ファイルを読み込んでデータをカスタムデータ型に処理する小さなプログラムがあります。ファイルを処理する再帰的タプル関数を持つHaskellの難点
cat 10 20 dog
hamster 12 2 wombat
monkey 1 9 zebra
lion 30 60 rhino
...
私のプログラムは次のようになります:
main :: IO()
main = do
contents <- readFile "myfile.xyz"
let process = clean contents
let f = processFile process
print f
clean :: String -> [[String]]
clean x = Prelude.map words $ lines x
processFile :: [[String]] -> [(XyzData)]
processFile [[a,b,c,d]] = [(XyzData a (read b :: Int) (read c :: Int) d)]
processFile (x:xs) = processFile xs
data XyzData = XyzData { animal1 :: String,
number1 :: Int,
number2 :: Int,
animal2 :: String
} deriving (Show)
私の問題はprocessFile
機能付きで読み込まれるファイルは、次のようになり、データの行が含まれています。現在のところ、この関数はファイルの最後の行をキャプチャし、それを画面に出力します。私は、この関数のリストでappendを使うのではなく、タプルを使って再帰を実装する方法を混乱させています。私の機能やこの機能の実装を改善する方法を誰にでも教えてください。このプログラムの印刷出力は、
[XyzData {animal1 = "cat", number1 = 10, number2 = 20, animal2 = "dog"},
[XyzData {animal1 = "hampster", number1 = 12, number2 = 2, animal2 = "wombat"},
[XyzData {animal1 = "monkey", number1 = 1, number2 = 9, animal2 = "zebra"},
[XyzData {animal1 = "lion", number1 = 30, number2 = 60, animal2 = "rhino"}]
です。
ハムスターとは何ですか?何かの冗談ですか? – x13n
修正されました。 – drbunsen