Haskellで「初めての型クラス」
Haskellの型クラスのことがよく分からなかったので、とりあえず、適当に作って動かしてみました。
分からなければ、実際に作り、動かす!
Haskellの型クラスを用いたプログラム
data Book = Dic | Novel | Comi | Note
data Fun = Toobad | Bad | Usual | Good | Verygood
data Pages = Pages Book Int
isfun :: Book -> Fun
isfun Dic = Toobad
isfun Novel = Toobad
isfun Comi = Verygood
isfun Note = Usual
fun_tostring :: Fun -> String
fun_tostring x =
case x of
Toobad -> "Too Bad!!"
Bad -> "Bad!"
Usual -> "Usual..."
Good -> "Good.."
Verygood -> "Very Good!!"
class Haskell a where
fun :: a -> Int
difficult :: a -> Int
instance Haskell Pages where
fun _ = 100
difficult _ = 10000
f b = fun b
main::IO()
main = do
let haskell_book = Pages Dic 600
let fun=fun_tostring(isfun ((\(Pages book page) -> book) haskell_book))
print fun
let page=((\(Pages book page) -> page) haskell_book)
print page
let h = f haskell_book
print h
実行結果は
"Too Bad!!"
600
100
解説
Bookは、本の種類を定義してます。
Funは、面白さ、Pagesは、ページ数を定義します。
関数isfunは、Book型を取りFun型を返します。
fun_tostringは、Fun型を取り、それに応じたStringを返します。
クラスHaskellは、関数funとdifficult を持ち、Int型を返します。
クラスHaskellのインスタンスは、相当手を抜いており、単純に決まった数値を返します。
main関数内
main関数内の解説をします。
let haskell_book = Pages Dic 600
haskell_bookは、600ページある辞書であると、定義しています。
let fun=fun_tostring(isfun ((\(Pages book page) -> book) haskell_book))
print fun
ラムダ関数により、haskell_bookから本の種類を取り出し、isfun関数によりその本の種類の面白さを調べます。
fun_tostring関数により、面白さに応じたString型を取得します。
それをprintします。(実行結果1行目)
let page=((\(Pages book page) -> page) haskell_book)
print page
haskell_bookから、ページ数を取り出し、printします。(実行結果2行目)
let h = f haskell_book
print h
関数fに、haskell_bookを渡し、関数funを実行してます。(実行結果3行目)
今回の型クラスいじりで知ったこと
今回、Haskellの型クラスを知るために、いろいろいじってみました。
知ったことと言っても、型クラスの使い方くらいです。