2016-04-12 3 views
0

Я новичок в 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"] Вот мой код, который отлично работаетHaskell сортировать значения из списка

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) I всегда получают первый элемент списка, поэтому сортируется только первый элемент. Как передать все значения списка? Вот что я пытался сделать let splitString = wordsWhen (==' ') (ff!![0..(length(ff)-1)]), к сожалению, это не работает. Любые идеи, как решить эту проблему?

ответ

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

Edit: улучшение правильно сортировать числовые значения:

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

Спасибо за ваш ответ, но что 'Prelude' после его реализации в моем коде я не в области: конструктор данных 'Prelute' – David

+1

' Prelude> '- это просто приглашение от интерактивного интерпретатора, а не часть кода. – chepner

+0

Привет, Дэйв, извините, если часть 'Prelude>' была запутанной, я просто быстро ее написал в 'ghci' и скопировал с терминала. – vikingsteve

Смежные вопросы