Help us understand the problem. What is going on with this article?

Haskellの型クラスで遊ぶ

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の型クラスを知るために、いろいろいじってみました。
知ったことと言っても、型クラスの使い方くらいです。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした