Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 排序和添加问题_Sorting_Haskell_Addition - Fatal编程技术网

Sorting 排序和添加问题

Sorting 排序和添加问题,sorting,haskell,addition,Sorting,Haskell,Addition,我是哈斯克尔的初学者。我在haskell中编写代码来读取文本文件并打印第2列和第4列,但我不知道在哪里放置排序机制,第2列由数字组成,因此如果数字重复,则应添加其值并显示ex的总数 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 (inter

我是哈斯克尔的初学者。我在haskell中编写代码来读取文本文件并打印第2列和第4列,但我不知道在哪里放置排序机制,第2列由数字组成,因此如果数字重复,则应添加其值并显示ex的总数

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")
modulemain其中
导入数据.List.Split(splitOn)
导入数据列表(插入)
项目::[Int]->[String]->[String]
项目索引l=foldl(\acc i->acc++[l!!i])[]索引
fromString::String->[[String]]
fromString=map(splitOn“|”)”。线
toString::[[String]]->String
toString=未对齐。地图(插入“|”)
main::IO()
main=do

putStrLn=您应该在映射之后排序:

main :: IO ()
main = do
  putStrLn =<<
  return . toString . sort . map (project [1, 3]) . fromString =<<
  readFile("table.txt")
这仍然有几个问题:

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

  • 首先将数据转换为
    [(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 ???
    


  • 我刚刚意识到,您的代码实际上并不是您的,而是逐字逐句地从中提取的。老实说,它看起来像是您复制了代码,而没有努力去理解它,现在正试图使用stackoverflow作为编码服务使其工作。当然,情况可能并非如此,但它看起来确实如此。请记住,我们通常更热衷于帮助那些表现出一定努力的人。

    他实际上也可以使用
    do
    符号:
    main=do s根据你的建议,我在“toString”之后加上了“sort”,但我得到的错误是“不在范围‘sort’”@Rahul您可以从
    数据导入
    排序
    。List
    @DavidYoung是的,它可以工作,谢谢,但正如我在问题中提到的那样。如果两个ID相同,我必须进行加法。例2 | 23.45 4 | 36.89 1 | 77.20 2 | 20.20它应该这样打印。。。1 | 77.20 2 | 43.65 4 | 36.89如果左侧有相同的数字,则其右侧值应相加并显示总数。。
    sumSameId :: [(Int,Double)] -> [(Int,Double)]
    sumSameId [] = ???
    sumSameId [(i,d)] = ???
    sumSameId ((i1,d1):(i2,d2):rest) = if i1==i2 then ??? else ???