2006-08-27
■ [ふつケル] 9.3節 代数的データ型
ふつケルを読み進めてきて、初めて固まった。最初は具体的な用途が全然見えてこなかったけど、後半の具体例とかでなんとなく使い道のイメージは沸いてきた。
代数的データ型をオブジェクト指向言語のクラスにたとえるならば
- 型コンストラクタ ... クラス
- データコンストラクタ ... クラスのコンストラクタ
みたいな感じだろうか。
■ [ふつケル] 9.5節 型クラス
型クラスは、数あるいろんな型を性質ごとに分類したグループみたいな感じ。そして、そのグループに属するためには、必要な条件(クラスメソッドの実装)がある。いや、条件というより、使えるクラスメソッドによって分類されるといったほうがいいのかな。うーん。
ふつケルに書いてあるように、Javaのインターフェースに概念としては近い。多重継承ができる。Eq型クラスのデフォルトの定義が面白い。
以前に悩んでいたことも、この節を読むことで解決した。==と等価な演算子を多相型で定義するときは、ちゃんと引数がEq型クラスのインスタンスの型であることを書かなければエラーが出る、ということ。
(<><>) :: (Eq a) => a -> a -> Bool a <><> b = a == b
これでおk。
■ [ふつケル] 9.6節 練習問題
ちょっと拡張してみた
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