fugafuga.write

日々のログ

すごいH本 part52

Functor 型クラス

Functor は全体を写せるものの型クラス

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

fmap を持つ。デフォルト実装は無い。fは1つの型引数を取る型コンストラクタ。

fmapは、

  • ある型 a から 別の型 b への関数
  • ある型 a に適用されたファンクター値

を取り、

  • 別の型 b のほうに適用されたファンクター値

を返す。

これは map に似ている

map :: (a -> b) -> [a] -> [b]

リストに対する Functor インスタンス宣言

instance Functor [] where
    fmap = map

map は リスト限定で動作する fmap と同じ。

*Main> fmap (*2) [1..3]
[2,4,6]
*Main> map (*2) [1..3]
[2,4,6]

Maybe は Functor

ファンクターになれるのは、箱のような働きをする型。 リストは色々な値を格納できる箱とみなせる。 Maybe も同じ。

instance Functor Maybe where
    fmap f (Just x) = Just (f x)
    fmap f Nothing = Nothing

Maybe型の値に対して fmap を適用する

*Main> fmap (++ " HEY GUYS IM INSIDE THE JUST") (Just "Something serious.")
Just "Something serious. HEY GUYS IM INSIDE THE JUST"
*Main> fmap (++ " HEY GUYS IM INSIDE THE JUST") Nothing
Nothing
*Main> fmap (*200) (Just 200)
Just 40000
*Main> fmap (*200) Nothing
Nothing

所感

Functor は map インターフェースみたいなものか。"関数を写す"というのがよくわからん。"関数を適用する"と違いがあるのか。

すごいHaskellたのしく学ぼう!

すごいHaskellたのしく学ぼう!

  • 作者: MiranLipovaca
  • 出版社/メーカー: オーム社
  • 発売日: 2017/07/14
  • メディア: Kindle版
  • 購入: 4人 クリック: 9回
  • この商品を含むブログを見る