【问题标题】:Haskell sort values from listHaskell 对列表中的值进行排序
【发布时间】:2016-08-03 12:16:04
【问题描述】:

我是 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)]) 不幸的是这不起作用。任何想法如何解决这个问题?

【问题讨论】:

    标签: list sorting haskell indexing


    【解决方案1】:

    您可以使用map 轻松完成此操作,并使用wordssortunwords(以恢复空白)的巧妙技巧。

    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"]
    

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

    import Data.List
    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"]
    

    【讨论】:

    • 感谢您的回答,但 Prelude 在我的代码中实现后是什么? Not in scope: data constructor Prelute
    • Prelude&gt; 只是来自交互式解释器的提示,而不是代码的一部分。
    • 嗨,戴夫,如果Prelude&gt; 部分令人困惑,我很抱歉,我只是在ghci 中快速编写并从终端复制粘贴。
    • 请注意,这是字符串排序,对于数字可能不准确。例如sort ["1","2","11"] 将给出["1","11","2"]
    猜你喜欢
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    相关资源
    最近更新 更多