我是哈斯克尔的初学者。我在haskell中编写代码来读取文本文件并打印第2和第4列,但我不知道在哪里放置排序机制,第2列由数字组成,所以如果数字重复,则应添加其值并显示ex的总数。 / p>
2 | 23.45
4 | 36.89
1 | 77.20
2 | 20.20
所以输出应该是
1 | 77.20
2 | 43.65
4 | 36.89
我的代码是:
module Main where
import Data.List.Split(splitOn)
import Data.List (intercalate)
project :: [Int] -> [String] -> [String]
project indices l = foldl (\acc i -> acc ++ [l !! i]) [] indices
fromString :: String -> [[String]]
fromString = map (splitOn "|") . lines
toString :: [[String]] -> String
toString = unlines . map (intercalate "|")
main :: IO ()
main = do
putStrLn =<<
return . toString . map (project [1, 3]) . fromString =<<
readFile("table.txt")
帮助我。感谢
答案 0 :(得分:2)
您应该在map
之后排序:
main :: IO ()
main = do
putStrLn =<<
return . toString . sort . map (project [1, 3]) . fromString =<<
readFile("table.txt")
顺便说一下,return
和=<<
可以简化如下:
main :: IO ()
main =
putStrLn . toString . sort . map (project [1, 3]) . fromString =<<
readFile "table.txt"
这还有几个问题:
我的建议是:
[(Int,Double)]
(查看read
或 - 如果您想合理处理格式错误的数据 - reads
)。 应用自定义函数来汇总相同的ID条目。对于初学者来说,这是一个很好的列表处理练习。只需填写下面的空白即可。记住你可以使用递归。
sumSameId :: [(Int,Double)] -> [(Int,Double)]
sumSameId [] = ???
sumSameId [(i,d)] = ???
sumSameId ((i1,d1):(i2,d2):rest) = if i1==i2 then ??? else ???
我刚刚意识到您的代码实际上不是您的代码,而是从an answer to a question of yours逐字逐句地获取。老实说,它看起来像你复制了代码而没有做任何努力理解它,现在正试图使用stackoverflow作为编码服务。当然,情况可能并非如此,但它看起来却是如此。请记住,我们通常更热衷于帮助那些付出努力的人。