递归元组函数在Haskell中的困难

递归元组函数在Haskell中的困难,haskell,recursion,Haskell,Recursion,我有一个小程序,可以读取文件并将数据处理为自定义数据类型。正在读取的文件包含如下所示的数据行: 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

我有一个小程序,可以读取文件并将数据处理为自定义数据类型。正在读取的文件包含如下所示的数据行:

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)
我处理文件的程序如下所示:

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 :: [[String]] -> [(XyzData)]
processFile ([a,b,c,d]:xs) = (XyzData a (read b :: Int) (read c :: Int) d) : processFile xs
processFile (x:xs) = processFile xs 
processFile [] = []

您的第一个模式
[[a,b,c,d]]
只匹配具有一个元素的列表,即具有四个元素的列表。

非常感谢您的帮助。我明白我做错了什么。您的解决方案工作正常。另外,我认为解决方案中的第三行((
processFile(x:xs)=processFile xs
)是多余的?它不是。他的第三行确保所有(内部)列表与
[a,b,c,d]
不匹配(即没有四个元素)被忽略,处理继续到文件的下一行。谢谢你的解释Riccardo,我现在明白了那行的目的。汉普斯特是什么?某种朗登?现在更正,谢谢你的回答!