fugafuga.write

日々のログ

すごいH本 part85

do 記法 do 記法は IOモナドだけでなく、他のモナドにも使える *Main Lib> Just 3 >>= (\x -> Just (show x ++ "!")) Just "3!" 入れ子にする *Main Lib> Just 3 >>= (\x -> Just "!" >>= (\y -> Just (show x ++ y))) Just "3!" let式と似ている *Main Lib>…

すごいH本 part84

ピエールを落とす バナナを仕掛けてピエールを問答無用で落とす関数を作る banana :: Pole -> Maybe Pole banana _ = Nothing これを一連の関数の中に混ぜて使う *Main> return (0, 0) >>= landLeft 1 >>= banana >>= landRight 1 Nothing 落ちた。 入力に関…

すごいH本 part83

ピエールの人生とは せっかくの休暇にバランス棒やってんのに鳥に邪魔されるピエール まず、鳥とポールを定義 その後に、ポールの右と左に鳥が止まる関数を定義 type Birds = Int type Pole = (Birds, Birds) landLeft :: Birds -> Pole -> Pole landLeft n …

すごいH本 part82

モナド モナドは強化されたアプリカティブファンクターである。 モナドはある願いを叶えるための、アプリカティブ値の自然な拡張である。 願いとは、 普通の値 a を取って文脈付きの値を返す関数に、文脈付きの値 m a を渡したい というもの。 言い換えると…

すごいH本 part81

モノイドで畳み込む いろいろなデータ構造の上に畳み込みを定義したい時にモノイドは便利。 *Main Lib F> F.foldr (*) 1 [1,2,3] 6 *Main Lib F> F.foldl (+) 2 (Just 9) 11 *Main Lib F> F.foldr (||) False (Just True) True もう少し複雑なデータ構造を畳…

すごいH本 part80

リストはモノイド インスタンス宣言 instance Monoid [a] where mempty = [] mappend = (++) リストは中身の型がなんであっても常に Monoid のインスタンスにできる。 *Main> [1,2,3] `mappend` [4,5,6] [1,2,3,4,5,6] *Main> ("one" `mappend` "two") `mapp…

すごいH本 part79

Monoid 大集合 以下のような共通の性質をもつ関数が存在する。 関数は引数を2つとる 2つの引数および返り値の型はすべて等しい 2引数関数を施して相手を変えないような特殊な値が存在する ++ なら空リスト * なら 1 例: x * 1, "hoho" ++ [] 例 *Main> (3 * …

すごいH本 part78

newtype と 遅延評価 undefined という値がある。これは、ぶっ壊れた計算を表す。 この値を評価すると Haskell はすごく怒る。 *Main> undefined *** Exception: Prelude.undefined CallStack (from HasCallStack): error, called at libraries/base/GHC/Err…

すごいH本 part77

モノイド Monoid は、値を2項演算子で結合できるような型を表現する。 newtype キーワード newtype キーワードを使うと、既存の型から新たな型を作ることができる。 リストをアプリカティブファンクターにする方法は複数ある。 左辺のリストの関数と右辺のリ…

すごいH本 part76

アプリカティブの便利な関数 Control.ApplicativeにliftA2という関数がある。 liftA2 :: (Applicative f) => (a -> b -> c) -> f a -> f b -> f c liftA2 f a b = f <$> a <*> b 1つの関数を2つのアプリカティブ値に適用する関数。 これを、 liftA2 :: (Appl…