排序和添加的问题

时间:2014-08-24 07:40:05

标签: sorting haskell addition

我是哈斯克尔的初学者。我在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")
帮助我。感谢

1 个答案:

答案 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"

这还有几个问题:

  • 它将ID排序为字符串,而不是数字(例如11来自4之前)
  • 它不会添加具有相同ID的项目

我的建议是:

  1. 首先将数据转换为[(Int,Double)](查看read或 - 如果您想合理处理格式错误的数据 - reads)。
  2. 对列表进行排序。
  3. 应用自定义函数来汇总相同的ID条目。对于初学者来说,这是一个很好的列表处理练习。只需填写下面的空白即可。记住你可以使用递归。

    sumSameId :: [(Int,Double)] -> [(Int,Double)]
    sumSameId [] = ???
    sumSameId [(i,d)] = ???
    sumSameId ((i1,d1):(i2,d2):rest) = if i1==i2 then ??? else ???
    

  4. 我刚刚意识到您的代码实际上不是您的代码,而是从an answer to a question of yours逐字逐句地获取。老实说,它看起来像你复制了代码而没有做任何努力理解它,现在正试图使用​​stackoverflow作为编码服务。当然,情况可能并非如此,但它看起来却是如此。请记住,我们通常更热衷于帮助那些付出努力的人。