SlideShare a Scribd company logo
1 of 19
Download to read offline
Haskell超初心者勉強会20
第14章 後半
2013/9/9
Sunday, September 8, 13
今日の内容
•Maybe モナドで電卓を安全にする
•モナディック関数の合成
•新しいモナドを作る
Sunday, September 8, 13
これまでの電卓
•方針: Maybe を使って、失敗を正しく扱う
solveRPN :: String -> Double
solveRPN = head . foldl foldingFunction [] . words
foldingFunction :: [Double] -> String -> [Double]
foldingFunction (x:y:ys) "*" = (y * x):ys
foldingFunction (x:y:ys) "+" = (y + x):ys
foldingFunction (x:y:ys) "-" = (y - x):ys
foldingFunction xs numberString = read numberString:xs
キケン!!
http://ideone.com/FNWy4l
Sunday, September 8, 13
reads (用意されている)
•読み取りに成功した時、[(読み取り結
果, 消費しきれなかった文字列)]
•読み込み失敗時は空リスト
> reads "123" :: [(Double, String)]
[(123.0,"")]
> reads "123abc" :: [(Double, String)]
[(123.0,"abc")]
> reads "abc" :: [(Double, String)]
[]
Sunday, September 8, 13
readMaybe
•全部読めたら Just
•それ以外は Nothing
readMaybe :: (Read a) => String -> Maybe a
readMaybe st = case reads st of [(x, "")] -> Just x
_ -> Nothing
Sunday, September 8, 13
畳み込み関数
•Maybe [Double] を返すモナディック
関数に変更する
foldingFunction :: [Double] -> String -> Maybe [Double]
foldingFunction (x:y:ys) "*" = return $ (y * x):ys
foldingFunction (x:y:ys) "+" = return $ (y + x):ys
foldingFunction (x:y:ys) "-" = return $ (y - x):ys
foldingFunction xs numberString =
liftM (:xs) (readMaybe numberString)
Sunday, September 8, 13
安全な solveRPN
•bind するときに pattern match
•pattern match に失敗すると Nothing
solveRPN :: String -> Maybe Double
solveRPN st = do
[result] <- foldM foldingFunction [] (words st)
return result
http://ideone.com/BiVXC4
Sunday, September 8, 13
モナディック関数の合成
<=<
-- ただの関数合成 .
f = (+1) . (*100)
-- モナディック関数の合成 <=<
-- テキストでは型宣言が無いが、型宣言が無いとコンパイルエラーになる。
g :: (Monad m, Num a) => a -> m a
g = (x -> return (x + 1)) <=< (x -> return (x * 100))
Sunday, September 8, 13
. → >=>
id → return
-- これはただの関数合成
f' = foldr (.) id [(+8),(*100),(+1)]
•ナイトが3手で行けるかを確認する関数
canReachIn3 を
関数合成でn手に一般化します。
•コード参照 http://ideone.com/l1GXEu
Sunday, September 8, 13
モナドを作る
•確率付きの値を表す Prob a
•確率部は Rational で表す
•1%2 → 1/2の確率
•[(3,1%2),(5,1%4),(9,1%4)] など
Sunday, September 8, 13
Prob newtype宣言
newtype Prob a =
Prob { getProb :: [(a, Rational)] }
deriving Show
Sunday, September 8, 13
Prob は Functor?
•List が Functor だから Prob もきっと
Functor
•値に作用させる
•確率はそのまま
instance Functor Prob where
fmap f (Prob xs) = Prob $ map ((x, p) -> (f x, p)) xs
Sunday, September 8, 13
Prob は Monad?
return
•値がきたら、確率 1 の Prob にすれば
いいのでは。
return x = Prob [(x, 1%1)]
Sunday, September 8, 13
Prob は Monad?
>=>
• m >>= f は常に join (fmap f m) と等価
• join :: Prob (Prob a) -> Prob a
から考えて、それを使って >>= を定義
Sunday, September 8, 13
flatten (join)
•外側の確率と内側の確率を掛ける
flatten :: Prob (Prob a) -> Prob a
flatten (Prob xs) = Prob $ concat $ map multAll xs
where multAll (Prob innerxs, p) =
map ((x, r) -> (x, p*r)) innerxs
Sunday, September 8, 13
Prod as Monad
•モナド則を満たしていることを確認
instance Monad Prob where
-- 文脈に入れるときは、必ずそれが起こる (=生起確率 1) で入れる。
return x = Prob [(x, 1%1)]
-- m >>= f は join (fmap f m)
m >>= f = flatten (fmap f m)
-- パターンマッチに失敗したら
fail _ = Prob []
Sunday, September 8, 13
イカサマコインを
投げる例
•コード参照 http://ideone.com/6FPW8M
Sunday, September 8, 13
Monadが出来るまで
•ある問題のある側面をモデル化した型
•あれ?もしや Monad?(気付き)
•Monad instance を与える
Sunday, September 8, 13
やっと14章おわったーー!
Sunday, September 8, 13

More Related Content

What's hot

Real World OCamlを読んでLispと協調してみた
Real World OCamlを読んでLispと協調してみたReal World OCamlを読んでLispと協調してみた
Real World OCamlを読んでLispと協調してみた
blackenedgold
 
Haskell超初心者勉強会11
Haskell超初心者勉強会11Haskell超初心者勉強会11
Haskell超初心者勉強会11
Takashi Kawachi
 
すごいHaskell 第7章 型や型クラスを自分で作ろう(後編)
すごいHaskell 第7章 型や型クラスを自分で作ろう(後編)すごいHaskell 第7章 型や型クラスを自分で作ろう(後編)
すごいHaskell 第7章 型や型クラスを自分で作ろう(後編)
Nozomu Kaneko
 

What's hot (20)

Start printf 6_takarakasai
Start printf 6_takarakasaiStart printf 6_takarakasai
Start printf 6_takarakasai
 
kollectionの紹介
kollectionの紹介kollectionの紹介
kollectionの紹介
 
これから Haskell を書くにあたって
これから Haskell を書くにあたってこれから Haskell を書くにあたって
これから Haskell を書くにあたって
 
OCamlのトップレベルあれそれ
OCamlのトップレベルあれそれOCamlのトップレベルあれそれ
OCamlのトップレベルあれそれ
 
200319 eash python_shareslide_functions
200319 eash python_shareslide_functions200319 eash python_shareslide_functions
200319 eash python_shareslide_functions
 
すごいHaskell読書会 in 大阪 2週目 #5 第5章:高階関数 (2)
すごいHaskell読書会 in 大阪 2週目 #5 第5章:高階関数 (2)すごいHaskell読書会 in 大阪 2週目 #5 第5章:高階関数 (2)
すごいHaskell読書会 in 大阪 2週目 #5 第5章:高階関数 (2)
 
Applicative functor
Applicative functorApplicative functor
Applicative functor
 
ナウなヤングにバカうけのイカしたタグ付き共用体
ナウなヤングにバカうけのイカしたタグ付き共用体ナウなヤングにバカうけのイカしたタグ付き共用体
ナウなヤングにバカうけのイカしたタグ付き共用体
 
前期講座09
前期講座09前期講座09
前期講座09
 
Real World OCamlを読んでLispと協調してみた
Real World OCamlを読んでLispと協調してみたReal World OCamlを読んでLispと協調してみた
Real World OCamlを読んでLispと協調してみた
 
Test12 16
Test12 16Test12 16
Test12 16
 
Haskell超初心者勉強会11
Haskell超初心者勉強会11Haskell超初心者勉強会11
Haskell超初心者勉強会11
 
asm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web gamesasm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web games
 
Python勉強会4-制御構文とパッケージ
Python勉強会4-制御構文とパッケージPython勉強会4-制御構文とパッケージ
Python勉強会4-制御構文とパッケージ
 
Goをカンストさせる話
Goをカンストさせる話Goをカンストさせる話
Goをカンストさせる話
 
関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml
 
すごいHaskell 第7章 型や型クラスを自分で作ろう(後編)
すごいHaskell 第7章 型や型クラスを自分で作ろう(後編)すごいHaskell 第7章 型や型クラスを自分で作ろう(後編)
すごいHaskell 第7章 型や型クラスを自分で作ろう(後編)
 
Lisp study
Lisp studyLisp study
Lisp study
 
第3回Webkit/HTML5勉強会 - File APIと加速度センサー
第3回Webkit/HTML5勉強会 - File APIと加速度センサー第3回Webkit/HTML5勉強会 - File APIと加速度センサー
第3回Webkit/HTML5勉強会 - File APIと加速度センサー
 
Extensible Eff Applicative
Extensible Eff ApplicativeExtensible Eff Applicative
Extensible Eff Applicative
 

Viewers also liked

Haskell超初心者勉強会17
Haskell超初心者勉強会17Haskell超初心者勉強会17
Haskell超初心者勉強会17
Takashi Kawachi
 
Scala稟議の通し方(公開版)
Scala稟議の通し方(公開版)Scala稟議の通し方(公開版)
Scala稟議の通し方(公開版)
鉄平 土佐
 
Haskell超初心者勉強会14
Haskell超初心者勉強会14Haskell超初心者勉強会14
Haskell超初心者勉強会14
Takashi Kawachi
 
Elastic beanstalk と Docker と Play
Elastic beanstalk と Docker と PlayElastic beanstalk と Docker と Play
Elastic beanstalk と Docker と Play
Takashi Kawachi
 

Viewers also liked (9)

Haskell超初心者勉強会17
Haskell超初心者勉強会17Haskell超初心者勉強会17
Haskell超初心者勉強会17
 
Scala稟議の通し方(公開版)
Scala稟議の通し方(公開版)Scala稟議の通し方(公開版)
Scala稟議の通し方(公開版)
 
Scalaのオブジェクトの話
Scalaのオブジェクトの話Scalaのオブジェクトの話
Scalaのオブジェクトの話
 
Haskell超初心者勉強会14
Haskell超初心者勉強会14Haskell超初心者勉強会14
Haskell超初心者勉強会14
 
Elastic beanstalk と Docker と Play
Elastic beanstalk と Docker と PlayElastic beanstalk と Docker と Play
Elastic beanstalk と Docker と Play
 
Scalaでの例外処理
Scalaでの例外処理Scalaでの例外処理
Scalaでの例外処理
 
Javaから始めるscalaっぽい書き方
Javaから始めるscalaっぽい書き方Javaから始めるscalaっぽい書き方
Javaから始めるscalaっぽい書き方
 
やさしいIteratee入門
やさしいIteratee入門やさしいIteratee入門
やさしいIteratee入門
 
並行処理初心者のためのAkka入門
並行処理初心者のためのAkka入門並行処理初心者のためのAkka入門
並行処理初心者のためのAkka入門
 

Similar to Haskell超初心者勉強会20

F#+Erlangで簡単なシューティングゲームを作ってみている
F#+Erlangで簡単なシューティングゲームを作ってみているF#+Erlangで簡単なシューティングゲームを作ってみている
F#+Erlangで簡単なシューティングゲームを作ってみている
pocketberserker
 
Scalamacrosについて
ScalamacrosについてScalamacrosについて
Scalamacrosについて
dekosuke
 
Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1
Ransui Iso
 
今さら始めるCoffeeScript
今さら始めるCoffeeScript今さら始めるCoffeeScript
今さら始めるCoffeeScript
Ashitaba YOSHIOKA
 
フィボナッチ数列の作り方
フィボナッチ数列の作り方フィボナッチ数列の作り方
フィボナッチ数列の作り方
Tomoya Kawanishi
 
すごいHaskell読書会#1 in 大阪
すごいHaskell読書会#1 in 大阪すごいHaskell読書会#1 in 大阪
すごいHaskell読書会#1 in 大阪
yashigani
 

Similar to Haskell超初心者勉強会20 (20)

Lispmeetup #53 PythonベースのLisp方言、 Hyのすすめ
Lispmeetup #53 PythonベースのLisp方言、 HyのすすめLispmeetup #53 PythonベースのLisp方言、 Hyのすすめ
Lispmeetup #53 PythonベースのLisp方言、 Hyのすすめ
 
これから Haskell を書くにあたって
これから Haskell を書くにあたってこれから Haskell を書くにあたって
これから Haskell を書くにあたって
 
F#+Erlangで簡単なシューティングゲームを作ってみている
F#+Erlangで簡単なシューティングゲームを作ってみているF#+Erlangで簡単なシューティングゲームを作ってみている
F#+Erlangで簡単なシューティングゲームを作ってみている
 
R新機能抄出
R新機能抄出R新機能抄出
R新機能抄出
 
Phantom Type in Scala
Phantom Type in ScalaPhantom Type in Scala
Phantom Type in Scala
 
ScalaプログラマのためのHaskell入門
ScalaプログラマのためのHaskell入門ScalaプログラマのためのHaskell入門
ScalaプログラマのためのHaskell入門
 
Kobe.R #15 - Incanter チョットシッテル
Kobe.R #15 - Incanter チョットシッテルKobe.R #15 - Incanter チョットシッテル
Kobe.R #15 - Incanter チョットシッテル
 
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6
 
Scalamacrosについて
ScalamacrosについてScalamacrosについて
Scalamacrosについて
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)
 
Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1
 
Testman
TestmanTestman
Testman
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2
 
第2回 JavaScriptから始めるプログラミング2016
第2回 JavaScriptから始めるプログラミング2016第2回 JavaScriptから始めるプログラミング2016
第2回 JavaScriptから始めるプログラミング2016
 
LastaFluteでKotlinをはじめよう
LastaFluteでKotlinをはじめようLastaFluteでKotlinをはじめよう
LastaFluteでKotlinをはじめよう
 
RのffでGLMしてみたけど...
RのffでGLMしてみたけど...RのffでGLMしてみたけど...
RのffでGLMしてみたけど...
 
今さら始めるCoffeeScript
今さら始めるCoffeeScript今さら始めるCoffeeScript
今さら始めるCoffeeScript
 
フィボナッチ数列の作り方
フィボナッチ数列の作り方フィボナッチ数列の作り方
フィボナッチ数列の作り方
 
すごいHaskell読書会#1 in 大阪
すごいHaskell読書会#1 in 大阪すごいHaskell読書会#1 in 大阪
すごいHaskell読書会#1 in 大阪
 
Java SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイルJava SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイル
 

More from Takashi Kawachi (6)

例外のlogを快適に
例外のlogを快適に例外のlogを快適に
例外のlogを快適に
 
MacroPyがすごい
MacroPyがすごいMacroPyがすごい
MacroPyがすごい
 
Silhouette intro
Silhouette introSilhouette intro
Silhouette intro
 
最小 Hello World! チャレンジ
最小 Hello World! チャレンジ最小 Hello World! チャレンジ
最小 Hello World! チャレンジ
 
Sbt doctest
Sbt doctestSbt doctest
Sbt doctest
 
Sbt lock1
Sbt lock1Sbt lock1
Sbt lock1
 

Haskell超初心者勉強会20