Haskell从列表中排序值

时间:2016-04-12 18:01:49

标签: list sorting haskell indexing

我是haskell的新手,我想对字符串列表进行排序。例如,我的变量ff中有一个包含三个字符串["1 8 8 5 6", "1 4 2 3", "5 4 9 7 9 9"]的列表,我想对它们进行排序,因此我的结果应该看起来像["1 5 6 8 8", "1 2 3 4", "4 5 7 9 9 9"]这里是我的代码完美的作品

import System.IO  
import Control.Monad
import Data.List
import Data.Function
import Data.Array
import Data.Char

sortNumeric = sortBy (compare `on` (read :: String -> Int))
wordsWhen :: (Char -> Bool) -> String -> [String]
wordsWhen p s =  case dropWhile p s of
                      "" -> []
                      s' -> w : wordsWhen p s''
                            where (w, s'') = break p s'
main = do
  file <- readFile "test.txt"
  let ff = map ((!!) (lines file)) [1,3..(length (lines file) - 1)]
  let splitString =  wordsWhen (==' ') (ff!!0)
  let sortedResult = sortNumeric (splitString)
  print sortedResult

问题在于这一行let splitString = wordsWhen (==' ') (ff!!0)我总是得到列表的第一个元素,所以只有第一个元素被排序。如何传递列表的所有值?这是我尝试做的事情let splitString = wordsWhen (==' ') (ff!![0..(length(ff)-1)]),不幸的是,这并不起作用。任何想法如何解决这个问题?

1 个答案:

答案 0 :(得分:5)

您可以使用map和niftry技巧轻松地使用wordssort然后unwords(以恢复空白)。

Prelude> let ff=["1 8 8 5 6", "1 4 2 3", "5 4 9 7 9 9"]
Prelude> import Data.List
Prelude Data.List> map (unwords . sort . words) ff
["1 5 6 8 8","1 2 3 4","4 5 7 9 9 9"]

编辑:改进以正确排序数值:

let ff=["11 8 8 5 6", "11 4 2 3", "5 4 9 7 99 9"]
let sortNumeric = (map show) . sort . (map (read :: String -> Int))
map (unwords . sortNumeric . words) ff

结果:

["5 6 8 8 11","2 3 4 11","4 5 7 9 9 99"]