tokoyax さん プロフィール

  •  
tokoyaxさん: fugafuga.write()
ハンドル名tokoyax さん
ブログタイトルfugafuga.write()
ブログURLhttp://blog.tokoyax.com
サイト紹介文IT エンジニアの技術を勉強→アウトプット。Ruby、Ruby on Rails、Vim などがメイン。たまに音楽話も。
参加カテゴリー
更新頻度(1年)情報提供142回 / 365日(平均2.7回/週) - 参加 2015/06/26 00:50

tokoyax さんのブログ記事

  • すごいH本 part95
  • EitherモナドMaybeモナドは値に失敗するかもしれないという文脈をつけられる。Eitherモナドも失敗
    の文脈を扱える。しかも、失敗に値を付加できるので失敗の説明ができたりする。Either e a は、Rig
    ht値であれば正解や計算の成功、Left値であれば失敗を表す。*Main Lib> :t Right 4Right 4 :: Num b => Ei
    ther a b*Main Lib> :t Left "out of cheese error"Left "out of cheese error" :: Either [Char] bEitherのMonad
    インスタンス [続きを読む]
  • すごいH本 part94
  • 計算の状態状態を扱うためにHaskellにはStateモナドが用意されている。状態付きの計算状態付きの計算とは、ある状態を取って、更新された状態と一緒に計算結果を返す関数として表現できる。s -> (a, s)s は状態の型で、 a は状態付き計算の結果。このような状態付きの計算も、文脈付きの値だとみなすことができる。計算の結果が「生の値」 であり、その計算結果を得るためには初期状態を与える必要があること、そして、計算の結果 [続きを読む]
  • すごいH本 part93
  • Reader関数の型 (->) r はファンクターであり、アプリカティブファンクターであるばかりでなく、モナドでもある。関数にとっての文脈とは、値がまだ手元になく、値がほしければその関数を別の何かに適用しないといけない。というもの。instance Monad ((->) r) where return x = _ -> x h >>= f = w -> f (h w) wreturn は最小限の文脈。値を取って値を返す。引数を無視すると必ず同じ値を返す。>>=は、モナド値を入力してモ [続きを読む]
  • すごいH本 part92
  • プログラムにログを追加するユークリッド互除法。2つの数を取り、最大公約数を求めるアルゴリズム。gcd関数を自前で作るgcd' :: Int -> Int -> Intgcd' a b | b == 0 = a | otherwise = gcd' b (a `mod` b)実行*Main> gcd' 8 318 と 3 の最大公約数は 1 なので正解ログの機能をつけるgcd' :: Int -> Int -> Writer [String] Intgcd' a b | b == 0 = do tell ["Finished with " ++ show a] | otherwise = [続きを読む]
  • すごいH本 part91
  • WriterWriterモナドはもう1つの値がくっついた値を表し、付加された値はログのように振る舞う。Writerモナドを使うと、一連の計算を行っている間全てのログが単一のログ値にまとめて記録されることを保証できる。盗賊団の人数をとり、それが大きな盗賊団であるかを返す関数isBigGang :: Int -> (Bool, String)isBigGang x = x > 9ただ True or False を返すだけでなく、この関数が何をしたかを示す文字列も一緒に返してほしい場合 [続きを読む]
  • カイゼン・ジャーニー 第3部読んだ
  • カイゼン・ジャーニー 第3部 読書メモ期待マネジメントのアップデートドラッカー風エクササイズ、インセプションデッキは定期的に見直す新しいメンバーが増えた時やプロジェクトの状況が一変した時内側の期待チームにおける期待(ドラッカー風エクササイズ)外側の期待プロジェクト関係者における期待(インセプションデッキ)期待のすり合わせを定期的に行うことリーダーズインテグレーションリーダーズインテグレーションとは、リー [続きを読む]
  • カイゼン・ジャーニー 第2部読んだ
  • カイゼン・ジャーニー 第2部 読書メモスクラム失敗を恐れず、学びを得てカイゼンするFail Fastスプリントプランニングとプロダクトバックログスプリント計画何をつくるべきかを決めるどうやって価値を届けるかを検討するプロダクトオーナーが作成するプロダクトバックログアイテムプロダクトバックログPBLリファインメントPBLはチーム全員が見えるようにしておく必要があるスプリントゴールスプリント達成を明文化する"課金・決済 [続きを読む]
  • カイゼン・ジャーニー 第1部読んだ
  • カイゼンジャーニー第1部の読書メモ自分がいつもいる場所から外に出るググるだけじゃだめ勉強会やイベントに赴き、質問や意見をぶつける他者のやり方をそのまま持ち込んで実践しても意味ない自分たちの状況に照らし合わせて適用する最初に取り組むもの見える化プラクティスタスクマネジメント目的を達成するための段取りスキルタスク分割タスクボードタスクの状態見える化朝会問題検知リズム作りふりかえり時間がなくてもふりかえ [続きを読む]
  • すごいH本 part90
  • モナド則ある型がMonadのインスタンスとなっていることは、その型が真にモナドであることを保証しない。真にモナドになるために、ある型はモナド則を満たす必要がある。左恒等性return x >>= f と f x は等価である。return がある値を最小限の文脈に入れるということができているかを見るモナド値と普通の値での操作結果に違いがないことを確認するMaybeモナドの場合Prelude> return 3 >>= (x -> Just (x+10000))Just 10003Prelud [続きを読む]
  • すごいH本 part89
  • 騎士の旅チェス盤の上にナイトの駒が1つだけ乗っており、ナイトを3回動かして特定のマスまで移動させられるかという問題を解く。type KnightPos = (Int, Int)moveKnight :: KnightPos -> [KnightPos]moveKnight (c,r) = do (c', r') [(c+2,r-1),(c+2,r+1),(c-2,r-1),(c-2,r+1) ,(c+1,r-2),(c+1,r+2),(c-1,r-2),(c-1,r+2) ] guard (c' `elem` [1..8] && r' `elem` [1..8]) return (c', r') [続きを読む]
  • すごいH本 part88
  • do 記法とリスト内包表記リスト内包表記はリストモナドの構文糖衣である。listOfTuples :: [(Int, Char)]listOfTuples = do n ↓*Main> [(n, ch) | n MonadPlus と guard 関数リスト内包表記では、filter をかけることができた。*Main> [x | x 7のつく数字だけを結果として返している。この動きを解明するためには、MonadPlus と guard 関数を知る必要がある。MonadPlus はモノイドの性質を併せ持つモナドを表す型クラス。class [続きを読む]
  • すごいH本 part87
  • リストモナド5という値は決定的である。一方、[1,2,3]のような値は複数の計算結果を含んでいるとも、複数の候補地を同時に重ね合わせたような1つの値であるとも解釈できる。リストをアプリカティブスタイルで使う*Main> (*) [1,2,3] [10,100,1000][10,100,1000,20,200,2000,30,300,3000]左辺のリスト要素と右辺のリスト要素のすべての組み合わせが結果のリストに含まれており、非決定性を表現している。この非決定性計算はモナド [続きを読む]
  • すごいH本 part86
  • ピエールリターンズピエールの綱渡りの一連の処理を do を使って書くroutine :: Maybe Poleroutine = do start return (0, 0) first landLeft 2 start second landRight 2 first landLeft 1 second実行*Main> routineJust (3,2)手続き型のように見えるがそうではない。ピエールにバナナの皮を踏ませたい場合routine :: Maybe Poleroutine = do start return (0, 0) first landLeft 2 start Nothing s [続きを読む]
  • すごい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> let x = 3; y = "!" in show x ++ y"3!"letと異なる点は文脈を持っているかどうか*Main Lib> Just 3 >>= (x -> Nothing >>= (y -> Just (show x ++ y)))NothingNothingを途中で与える [続きを読む]
  • すごいH本 part84
  • ピエールを落とすバナナを仕掛けてピエールを問答無用で落とす関数を作るbanana :: Pole -> Maybe Polebanana _ = Nothingこれを一連の関数の中に混ぜて使う*Main> return (0, 0) >>= landLeft 1 >>= banana >>= landRight 1Nothing落ちた。入力に関係なく規定のモナド値を返す関数を作りたい場合、>>を使うとよい。(>>) :: (Monad m) => m a -> m b -> m bm >> n = m >>= _ -> n実行*Main> Nothing >> Just 3Nothing*Main> Just 3 [続きを読む]
  • すごいH本 part83
  • ピエールの人生とはせっかくの休暇にバランス棒やってんのに鳥に邪魔されるピエールまず、鳥
    とポールを定義その後に、ポールの右と左に鳥が止まる関数を定義type Birds = Inttype Pole = (Birds, Birds
    )landLeft :: Birds -> Pole -> PolelandLeft n (left, right) = (left + n, right)landRight :: Birds -> Pole -> PolelandRi
    ght n (left, right) = (left, right + n)実行*Main> landLeft 2 (0, 0)(2,0)*Main> landRight 5 (1, [続きを読む]
  • すごいH本 part82
  • モナドモナドは強化されたアプリカティブファンクターである。モナドはある願いを叶えるための、アプリカティブ値の自然な拡張である。願いとは、普通の値 a を取って文脈付きの値を返す関数に、文脈付きの値 m a を渡したいというもの。言い換えると、a -> m b型の関数を、m a型の値に適用したい。ということ。(>>=) :: (Monad m) => m a -> (a -> m b) -> m bつまり、この関数が使いたい。関数>>=はバインド(bind)と呼ばれる。文 [続きを読む]
  • すごい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もう少し複雑なデータ構造を畳み込んでみてみる7章で扱った木構造data Tree a = EmptyTree | Node a (Tree a) (Tree a) deriving (Show)木を Foldable のインスタンスにして畳み込みできるようにする。foldr を実 [続きを読む]
  • すごい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") `mappend` "tree""onetwotree"*Main> "one" `mappend` ("two" `mappend` "tree")"onetwotree"*Main> "one" `mappend` "two" `mappend` "tree""onetwotree"*Main> "pang" `mappend [続きを読む]
  • すごいH本 part79
  • Monoid 大集合以下のような共通の性質をもつ関数が存在する。関数は引数を2つとる2つの引数およ
    び返り値の型はすべて等しい2引数関数を施して相手を変えないような特殊な値が存在する++ なら
    空リスト* なら 1例: x * 1, "hoho" ++ []例*Main> (3 * 2) * (8 * 5)240*Main> 3 * (2 * (8 * 5))240*Main> &q
    uot;la" ++ ("di" ++ "ga")"ladiga"*Main> ("la" ++ "di") ++ "ga"
    "ladiga"この性質を 結合的(associativity) という。++ や * が当 [続きを読む]
  • すごいH本 part78
  • newtype と 遅延評価undefined という値がある。これは、ぶっ壊れた計算を表す。この値を評価すると
    Haskell はすごく怒る。*Main> undefined*** Exception: Prelude.undefinedCallStack (from HasCallStack): error, called at
    libraries/base/GHC/Err.hs:79:14 in base:GHC.Err undefined, called at :14:1 in interactive:Ghci3すなわち例外を投げる。
    しかし、undefined を含むリストを作っても、undefined の要素を要求しな [続きを読む]
  • すごいH本 part77
  • モノイドMonoid は、値を2項演算子で結合できるような型を表現する。newtype キーワードnewtype キーワードを使うと、既存の型から新たな型を作ることができる。リストをアプリカティブファンクターにする方法は複数ある。左辺のリストの関数と右辺のリストの値のあらゆる組み合わせのリストを作る方法。*Main Control.Applicative> [(+1),(*100),(*5)] [1,2,3][2,3,4,100,200,300,5,10,15]2つのリストを綴じ合わせるように新たな [続きを読む]
  • すごいH本 part76
  • アプリカティブの便利な関数Control.ApplicativeにliftA2という関数がある。liftA2 :: (Applicative f) => (a -> b -> c) -> f a -> f b -> f cliftA2 f a b = f a b1つの関数を2つのアプリカティブ値に適用する関数。これを、liftA2 :: (Applicative f) => (a -> b -> c) -> (f a -> f b -> f c)のように解釈すると、通常の2引数関数を、2つのアプリカティブ値を引数に取る関数に昇格させる関数とみなすことができる。2つのアプ [続きを読む]
  • すごいH本 part75
  • ZipリストZipList という型があり、これは Applicative のインスタンスである。instance Applicative ZipList where pure x = ZipList (repeat x) ZipList fs ZipList xs = ZipList (zipWith (f x -> f x) fs xs) は1つ目の関数を1つ目の値に、2つめの関数を2つ目の値に、... と適用する。zipWith の仕様上短い方のリストに合わせた結果となる。pure は、引数をとってそれを無限に繰り返すリストを返す。この定義なら pure [続きを読む]