LoginSignup
3
1

More than 3 years have passed since last update.

Haskellの型クラスで遊ぶ

Posted at

Haskellで「初めての型クラス」

Haskellの型クラスのことがよく分からなかったので、とりあえず、適当に作って動かしてみました。
分からなければ、実際に作り、動かす!

Haskellの型クラスを用いたプログラム

class.hs
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は、関数fundifficultを持ち、Int型を返します。
クラスHaskellのインスタンスは、相当手を抜いており、単純に決まった数値を返します。

main関数内

main関数内の解説をします。

class.hs
    let haskell_book = Pages Dic 600

haskell_bookは、600ページある辞書であると、定義しています。

class.hs
    let fun=fun_tostring(isfun ((\(Pages book page) -> book) haskell_book))
    print fun

ラムダ関数により、haskell_bookから本の種類を取り出し、isfun関数によりその本の種類の面白さを調べます。
fun_tostring関数により、面白さに応じたString型を取得します。
それをprintします。(実行結果1行目)

class.hs
    let page=((\(Pages book page) -> page) haskell_book)
    print page

haskell_bookから、ページ数を取り出し、printします。(実行結果2行目)

class.hs
    let h = f haskell_book
    print h

関数fに、haskell_bookを渡し、関数funを実行してます。(実行結果3行目)

今回の型クラスいじりで知ったこと

今回、Haskellの型クラスを知るために、いろいろいじってみました。
知ったことと言っても、型クラスの使い方くらいです。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1