hayaのHaskell日記

2006-08-27

[] 9.6節 練習問題 00:12

ちょっと拡張してみた

import List
import System

main = do cs <- getContents
          args <- getArgs
          putStr $ sortedStr (orderFromArg ((\(x:_) -> x) args) ) cs

sortedStr :: Order -> String -> String
sortedStr ord = unlines . map show . sortLinesBy ord . stringLines

orderFromArg :: String -> Order
orderFromArg ord
  | ord == "desc" = Desc
  | ord == "asc"  = Asc
  | otherwise     = Asc

stringLines :: String -> [Line]
stringLines = map tupleLine . zip [1..] . lines

tupleLine :: (Int, String) -> Line
tupleLine tup = MakeLine {number = fst tup, string = snd tup}

{- Definitions -}

data Line = MakeLine { number :: Int,
                       string :: String} deriving Show

data Order = Asc | Desc deriving Eq

sortLines :: [Line] -> [Line]
sortLines = sortBy (\x y -> number x `compare` number y)

sortLinesBy :: Order -> [Line] -> [Line]
sortLinesBy ord
  | ord == Asc  = sortBy (\x y -> number x `compare` number y)
  | ord == Desc = sortBy (\x y -> number y `compare` number x)

昇順でソートするか、降順でソートするか、コマンドライン引数から指定できるsortLinesBy関数を定義した。sortLinesはそのエイリアス

コンパイルしてできたバイナリ名(lines.exe)とすると

lines asc < データファイル名

で昇順にソート

lines desc < データファイル名

で降順にソート

解答を写経

1
data Line = Line Int String
2
data Line = Line Int String deriving Show
main = print (Line 2 "test")
3
data Line = Line {number :: Int, string :: String} deriving Show
4
myLines :: [Line]
myLines :: [(Lines 4 "4th line"),
            (Lines 1 "first line"),
            (Lines 5 "5th line"),
            (Lines 3 "3rd line"),
            (Lines 2 "second line")]

main = print myLines
5
sortLines :: [Line] -> [Line]
sortLines = sortBy (\a b -> number a `compare` number b)
トラックバック - http://haskell.g.hatena.ne.jp/harg/20060827