tokoyax さん プロフィール

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

tokoyax さんのブログ記事

  • すごいH本 part100
  • ある男の物語男は今日も楽しそうなゾウさんと戯れる。本を手に取り、残り少なくなったページを開く。ふと、個性的な挿絵に目が止まる。「著作権、著作権、著作権」三回唱えて真っ黒な画面に眠たげな両目を向けた。「ピエールくんは休みの日に綱渡りしてる。友達になりたい。鳥に止まられ、バナナを仕掛けられ、落ち続けてもなおめげないそこが魅力的だ。」独白は黒い画面に吸い込まれる。はあ、とため息をひとつ、残りのページを確 [続きを読む]
  • すごいH本 part99
  • ZipperHaskellで木構造の要素を変更したい場合、ルート要素から指定の要素が見つかるまで探索が必要になる。また、前回更新した要素の近くの要素を更新したい場合などでもルートから探す必要がある。これは効率が悪い。そこでZipperを使ってデータ構造の要素の更新を簡単にする。歩く木構造のデータ型を定義するdata Tree a = Empty | Node a (Tree a) (Tree a) deriving (Show)木構造データを定義するfreeTree :: Tree CharfreeTr [続きを読む]
  • すごいH本 part98
  • モナドを作るモナドは作りたいと思って作るものではない。ある問題の側面をモデル化した型を作り、後からその型が文脈付きの値を表現していてモナドのように振る舞うとわかった場合に、Monadインスタンスを与える場合が多い。リスト [3,5,9] を、整数3, 5, 9が同時に存在している状態だとすると、それぞれの数の存在確率の情報が足りないと気づく。確率も含めて表現するとこう、[(3,0.5),(5,0.25),(9,0.25)]数学では確率は0から1ま [続きを読む]
  • すごいH本 part97
  • 安全な逆ポーランド記法電卓をつくる前に作ったRPN電卓にエラー機能をつける。import Control.MonadsolveRPN :: String -> Maybe DoublesolveRPN st = do [result] foldM foldingFunction [] $ words st return resultfoldingFunction :: [Double] -> String -> Maybe [Double]foldingFunction (x:y:ys) "*" = return ((y * x):ys)foldingFunction (x:y:ys) "+" = return ((y + x):ys)foldingFunction (x:y [続きを読む]
  • すごいH本 part96
  • 便利なモナディック関数モナドを扱う関数はモナディック関数と呼ばれる。liftM関数とモナド値をとって、関数でモナド値を写してくれる。fmapっぽい。liftM :: Monad m => (a1 -> r) -> m a1 -> m rfmap の型fmap :: Functor f => (a -> b) -> f a -> f bファンクター則とモナド則を満たしている場合、fmap と liftM はまったく同じものになる。liftM を試す*Main> liftM (*3) (Just 8)Just 24*Main> fmap (*3) (Just 8)Just 24*Mai [続きを読む]
  • すごい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)と呼ばれる。文 [続きを読む]