テストステ論

高テス協会会長が, テストステロンに関する情報をお届けします.

Functorを試す (2)

Functorについてさらに調査しましょう. Functorの関数は他にもあります.

Prelude Control.Applicative Control.Monad> :t void
void :: Functor f => f a -> f ()

この関数はファンクタの中身を()にします.

このvoidを使って面白い実験をしましょう.

Prelude Control.Applicative Control.Monad> void $ Just 1
Just ()
Prelude Control.Applicative Control.Monad> void Just $ 1
()

前者が常識的な挙動ですが, 後者は何でしょう?予想に反しています.

Justの型は, Just :: a -> Maybe aです. voidを実装すると, fmap (¥_ -> ())ですから, 「関数がファンクタである」ということを思い出すと, これは関数合成なのだと分かります.

void Just
= fmap (¥_ -> ()) (¥x -> Just x)
= (¥_ -> ()) . (¥x -> Just x)
= (¥x -> ())

こうして,

Prelude Control.Applicative Control.Monad> :t void Just
void Just :: a -> ()

が生まれます.

最後にこの関数はH本ではApplicativeのところで紹介されていますが, 実はファンクタの関数です.

Prelude Control.Applicative Control.Monad> :t (<$>)
(<$>) :: Functor f => (a -> b) -> f a -> f b

ghciって便利ですね.

広告を非表示にする