« javaScript 再帰関数2 | トップページ | Haskell Functor type class 2 »

2011年4月12日 (火)

Haskell Functor type class

Functorとは、Type Classである。
Type Classとは、あるふるまいを定義するインタフェースである。
ある型があるType Classのインスタンスであるとき、その型はType Classの定義するふるまいを実装する。

Eq Type Class の 値が、イコール判定が可能なように、
Functor Type Class の 値は、マップ可能。

class Eq a where
  (==) :: a -> a -> Bool
  (/=) :: a -> a -> Bool

class Functor f where
fmap :: (a -> b) -> f a -> f b



Eq a の aは、具体的な型(Int, Char など)
Functor f の fは、type constructor である。
type constructorとは、具体的な型を受け取って型を作るもののこと。

例えば、Maybe Int のMaybeは、Intを受け取って、
具体的な型になるため、type constructorである。

Maybeは、パラメータを1つもつtype constructorであるため、
Functorのインスタンスと成り得る。(実際なっている。:i Maybe)

Functorのインスタンスであるので、次の記述が可能
>fmap (*2) (Just 3)
Just 6

>fmap (*2) Nothing
Nothing

これの何がうれしいのかはよくわからない。

Learn You a Haskell for Great Good!より

Types that can act like a box can be functors.
箱のように扱うことができる型は、ファンクターになり得る。

箱のように、とは、何か入ってるかもしれないし、空かもしれないもの。

Myabe aはまさにそのような型になる。


data Maybe a = Nothing | Just a

では、
data XXX a
とは、どういう意味か。これは、kindをとると、
>:k XXX
XXX :: * -> *
になるもので、XXXはFunctorのインスタンスに成り得る。

定義をもう一度見る。



class Functor f where
fmap :: (a -> b) -> f a -> f b

f aがあるときに、f bが欲しい。その場合、(a -> b)を用意して、
fmapを使えば良い。

fmap :: (a -> b) -> XXX a -> XXX b

具体的には、
fmap :: (Int -> Int) -> Maybe Int -> Maybe Int

やっぱり何がいいのかよくわからない。

逆から考えて、例えば、Just 3という値を2倍するには、fmap以外でどうできるか。

(Just 3) * 2、というのは許されない。

multi :: (a -> a ) -> Maybe a -> Maybe a
multi f (Just x) = Just (f x)
multi f Nothing = Nothing


>multi (*2) (Just 3)
Just 6

このような関数をわざわざ作らなくて良い、ということなのかな。

たぶんXXX aという型は、何か抽象的な意味があって、それに対する一般的な演算、ということなんだろうけど、イメージできない。

例えば、どういう型かは知らないが値が入っている箱があり、
その値を演算し、別の箱に入れ替える、というような。

箱の中身が1つの値であれば、Maybeであり、複数であれば、リストである、というような。

Haskell Functorで検索すると、数学的な解説が(群とか)出てくるんだけど、
あんなもの俺が理解できるわけがない。

(追記)ぜんぜんわかってないみたいなんで、後にまたエントリを作ります。

|

« javaScript 再帰関数2 | トップページ | Haskell Functor type class 2 »

Haskell」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1049865/39577688

この記事へのトラックバック一覧です: Haskell Functor type class:

« javaScript 再帰関数2 | トップページ | Haskell Functor type class 2 »