我是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)])
,不幸的是,这并不起作用。任何想法如何解决这个问题?
答案 0 :(得分:5)
您可以使用map
和niftry技巧轻松地使用words
,sort
然后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"]