hayaのHaskell日記

2006-08-27

[] 9.2節 静的型チェック型推論 18:12

いままでやってきたことでほぼカバーされた内容の復習。さらりと。

[] 9.3節 代数的データ型 18:12

ふつケルを読み進めてきて、初めて固まった。最初は具体的な用途が全然見えてこなかったけど、後半の具体例とかでなんとなく使い道のイメージは沸いてきた。

代数的データ型オブジェクト指向言語クラスにたとえるならば

みたいな感じだろうか。

再帰的な型の具体的な活用例も欲しかった。

[] 9.4節 型の別名と付け替え 18:12

何に使うのか不明なので流し読み。必要になったらまた読む。

[] 9.5節 型クラス 18:12

型クラスは、数あるいろんな型を性質ごとに分類したグループみたいな感じ。そして、そのグループに属するためには、必要な条件(クラスメソッドの実装)がある。いや、条件というより、使えるクラスメソッドによって分類されるといったほうがいいのかな。うーん。

ふつケルに書いてあるように、Javaインターフェース概念としては近い。多重継承ができる。Eq型クラスデフォルトの定義が面白い。

以前に悩んでいたことも、この節を読むことで解決した。==と等価演算子多相型で定義するときは、ちゃんと引数Eq型クラスインスタンスの型であることを書かなければエラーが出る、ということ。

(<><>) :: (Eq a) => a -> a -> Bool
a <><> b = a == b

これでおk。

[] 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)

[] 9章の感想 00:18

最初の代数的データ型あたりは、なんか退屈だったけど、型クラスはとても楽しく読めた。代数的データ型の「よくわからないもやもやとした感じ」が、章を読み進めるにつれてだんだんと晴れていくような楽しさがあった。練習問題も面白かったので、思わず拡張してみた。

ゲスト



トラックバック - http://haskell.g.hatena.ne.jp/harg/20060827