Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
Submit search
EN
Uploaded by
Yoichi Nakayama
837 views
すごいHaskell読書会 in 大阪 2週目 #5 第5章:高階関数 (2)
http://atnd.org/events/49567
Software
◦
Read more
2
Save
Share
Embed
Embed presentation
Download
Download to read offline
1
/ 33
2
/ 33
3
/ 33
4
/ 33
5
/ 33
6
/ 33
7
/ 33
8
/ 33
9
/ 33
10
/ 33
11
/ 33
12
/ 33
13
/ 33
14
/ 33
15
/ 33
16
/ 33
17
/ 33
18
/ 33
19
/ 33
20
/ 33
21
/ 33
22
/ 33
23
/ 33
24
/ 33
25
/ 33
26
/ 33
27
/ 33
28
/ 33
29
/ 33
30
/ 33
31
/ 33
32
/ 33
33
/ 33
More Related Content
PPTX
Rによる富士山関数の描き方
by
wada, kazumi
PPTX
データとは何か
by
Kenta Suzuki
PDF
リストモナドを作ってみた
by
Atsushi Kanehara
PDF
Sclalaz Kleisli の使い方
by
Masaru Watanabe
PDF
Goをカンストさせる話
by
Moriyoshi Koizumi
PDF
すごいHaskell楽しく学ぼう 第6章
by
aomori ringo
KEY
by
a-hisame
KEY
JavaScript Hackathon for Students
by
Takumi Ohashi
Rによる富士山関数の描き方
by
wada, kazumi
データとは何か
by
Kenta Suzuki
リストモナドを作ってみた
by
Atsushi Kanehara
Sclalaz Kleisli の使い方
by
Masaru Watanabe
Goをカンストさせる話
by
Moriyoshi Koizumi
すごいHaskell楽しく学ぼう 第6章
by
aomori ringo
by
a-hisame
JavaScript Hackathon for Students
by
Takumi Ohashi
What's hot
PPTX
シェーダープログラムを無限に生成するガチャつくってみた PCD2019
by
Masaru Mizuochi
PPTX
ラプシアン作用素
by
nabeshimamasataka
PDF
らプラシアン作用素
by
政孝 鍋島
PDF
距離まとめられませんでした
by
Haruka Ozaki
PDF
Boost.B-tree introduction
by
Takayuki Goto
PDF
アニメーションの実装つらい話
by
kata shin
PDF
glossはおもろい
by
karky7
PDF
すごいH 第12章モノイド
by
Shinta Hatatani
PPT
K010 appstat201201
by
t2tarumi
KEY
モナドがいっぱい!
by
Kenta Sato
PDF
Haskell勉強会 14.1〜14.3 の説明資料
by
Etsuji Nakai
PPTX
CG2013 05
by
shiozawa_h
PDF
Elixirでディープラーニング! Keras+PyTorchみたいな DL入門向けライブラリ「Axon」
by
Yuisho Takafuji
ODP
第三回R勉強会
by
Paweł Rusin
PPTX
CG2013 03
by
shiozawa_h
PDF
RでGIS
by
Hoshida Yukihisa
PDF
RでGISハンズオンセッション
by
arctic_tern265
シェーダープログラムを無限に生成するガチャつくってみた PCD2019
by
Masaru Mizuochi
ラプシアン作用素
by
nabeshimamasataka
らプラシアン作用素
by
政孝 鍋島
距離まとめられませんでした
by
Haruka Ozaki
Boost.B-tree introduction
by
Takayuki Goto
アニメーションの実装つらい話
by
kata shin
glossはおもろい
by
karky7
すごいH 第12章モノイド
by
Shinta Hatatani
K010 appstat201201
by
t2tarumi
モナドがいっぱい!
by
Kenta Sato
Haskell勉強会 14.1〜14.3 の説明資料
by
Etsuji Nakai
CG2013 05
by
shiozawa_h
Elixirでディープラーニング! Keras+PyTorchみたいな DL入門向けライブラリ「Axon」
by
Yuisho Takafuji
第三回R勉強会
by
Paweł Rusin
CG2013 03
by
shiozawa_h
RでGIS
by
Hoshida Yukihisa
RでGISハンズオンセッション
by
arctic_tern265
Similar to すごいHaskell読書会 in 大阪 2週目 #5 第5章:高階関数 (2)
PDF
すごいHaskell読書会 第六章 発表資料
by
Hiromasa Ohashi
PDF
Introduction to Categorical Programming (Revised)
by
Masahiro Sakai
PDF
たのしい関数型
by
Shinichi Kozake
PPTX
純粋関数型アルゴリズム入門
by
Kimikazu Kato
PDF
すごいHaskell読書会#1 in 大阪
by
yashigani
PDF
関数プログラミング入門
by
Hideyuki Tanaka
PDF
Introduction to Categorical Programming
by
Masahiro Sakai
PDF
代数的データ型をラムダ計算の中で表現する方法
by
syamino
PDF
Haskell超入門 Part.1
by
Yuichi Watanabe
PPTX
Programming Haskell Chapter 11 切符番号選び
by
dekosuke
PDF
たのしい高階関数
by
Shinichi Kozake
PDF
関数型プログラミング入門 with OCaml
by
Haruka Oikawa
ODP
これから Haskell を書くにあたって
by
Tsuyoshi Matsudate
KEY
Algebraic DP: 動的計画法を書きやすく
by
Hiromi Ishii
PDF
Haskell勉強会 in ie
by
maeken2010
PDF
初めてのHaskell (表)
by
karky7
PDF
F#入門 ~関数プログラミングとは何か~
by
Nobuhisa Koizumi
PDF
Haskell超初心者勉強会20
by
Takashi Kawachi
PDF
プログラミングHaskell(第2章)
by
yaju88
PDF
純LISPから考える関数型言語のプリミティブ: Clojure, Elixir, Haskell, Scala
by
Kent Ohashi
すごいHaskell読書会 第六章 発表資料
by
Hiromasa Ohashi
Introduction to Categorical Programming (Revised)
by
Masahiro Sakai
たのしい関数型
by
Shinichi Kozake
純粋関数型アルゴリズム入門
by
Kimikazu Kato
すごいHaskell読書会#1 in 大阪
by
yashigani
関数プログラミング入門
by
Hideyuki Tanaka
Introduction to Categorical Programming
by
Masahiro Sakai
代数的データ型をラムダ計算の中で表現する方法
by
syamino
Haskell超入門 Part.1
by
Yuichi Watanabe
Programming Haskell Chapter 11 切符番号選び
by
dekosuke
たのしい高階関数
by
Shinichi Kozake
関数型プログラミング入門 with OCaml
by
Haruka Oikawa
これから Haskell を書くにあたって
by
Tsuyoshi Matsudate
Algebraic DP: 動的計画法を書きやすく
by
Hiromi Ishii
Haskell勉強会 in ie
by
maeken2010
初めてのHaskell (表)
by
karky7
F#入門 ~関数プログラミングとは何か~
by
Nobuhisa Koizumi
Haskell超初心者勉強会20
by
Takashi Kawachi
プログラミングHaskell(第2章)
by
yaju88
純LISPから考える関数型言語のプリミティブ: Clojure, Elixir, Haskell, Scala
by
Kent Ohashi
すごいHaskell読書会 in 大阪 2週目 #5 第5章:高階関数 (2)
1.
すごいHaskell読書会 in 大阪
2週目 #5 第5章:高階関数 (2) 2014/05/14 なかやま よういち 1
2.
Contents 5.5 畳み込み、見込みアリ! 5.6 $
を使った関数適用 5.7 関数合成 2
3.
力の階層 ↑ 自由度:高、抽象度:低 ↑ • 再帰 • foldr、foldl
など • filter、take など ↓ 自由度:低、抽象度:高 ↓ 3 }5.5 畳み込み 5.6, 5.7 簡素化 ($)、(.)
4.
5.5 畳み込み、見込みアリ! fold 【動詞】 〈紙・布などを〉折る,折り重ねる,折りたたむ 〈端などを〉折り曲げる,折り返す (2引数関数,
アキュムレータ初期値, リスト) → 答 アキュムレータ(accumulator):演算装置による演算結果を累積 する、すなわち総和を得るといったような計算に使うレジスタや 変数のこと http://ja.wikipedia.org/wiki/アキュムレータ_(コン ピュータ) 4
5.
foldl(左畳み込み) リストの左から畳み込んでいく! foldl f z
[x1, x2, ..., xn]! = (...((z `f` x1) `f` x2) `f`...) `f` xn! ! foldl (+) 0 [1, 2, 3, 4, 5]! = ((((0 + 1) + 2) + 3) + 4) + 5 5
6.
foldl(定義) foldl f z
[x1, x2, ..., xn]! = (...((z `f` x1) `f` x2) `f`...) `f` xn! ! 再帰による定義:! foldl :: (b -> a -> b) -> b -> [a] -> b! foldl _ z [] = z! foldl f z (x:xs) = foldl f (f z x) xs! ! 再帰定義の右辺でfoldlが一番外側に→末尾再帰 6
7.
foldr(右畳み込み) リストの右から畳み込んでいく! foldr f z
[x1, x2, ..., xn]! = x1 `f` (x2 `f` ... (xn `f` z)…)! ! foldr (+) 0 [1, 2, 3, 4, 5]! = 1 + (2 + (3 + (4 + (5 + 0))))! ! 評価順序については何も言っていないことに注意 7
8.
foldr(定義) foldr f z
[x1, x2, ..., xn]! = x1 `f` (x2 `f` ... (xn `f` z)…)! ! 再帰による定義:! foldr :: (a -> b -> b) -> b -> [a] -> b! foldr _ z [] = z! foldr f z (x:xs) = f x (foldr f z xs) 8
9.
sum suml = foldl
(+) 0! ! sumr = foldr (+) 0! ! suml [1, 2, 3, 4, 5]! = ((((0 + 1) + 2) + 3) + 4) + 5! ! sumr [1, 2, 3, 4, 5]! = 1 + (2 + (3 + (4 + (5 + 0)))) 9
10.
and and :: [Bool]
-> Bool! 再帰による定義:! and [] = True! and (x:xs) = x && and xs! foldrを使って定義(一行で書ける!):! and = fold (&&) True 10
11.
and(with foldr) andr ::
[Bool] -> Bool! andr = foldr (&&) True! ! andr [] == True! andr [True] == True! andr [False] == False! andr [True, False] == False! andr (repeat False) == False … 無限リストでもちゃんとFalseで止まる 11
12.
andモドキ(with foldl) andl ::
[Bool] -> Bool! andl = foldl (&&) True! ! andl [] == True! andl [True] == True! andl [False] == False! andl [True, False] == False! andl (repeat False) …? 12
13.
map map :: (a
-> b) -> [a] -> [b]! ! 再帰による定義:! map _ [] = []! map f (x:xs) = f x : map f xs! ! foldrを使って定義:! map f = foldr (x acc -> f x : acc) []! 13
14.
map (with foldr) mapr
:: (a -> b) -> [a] -> [b]! mapr f = foldr (x acc -> f x : acc) []! ! mapr (*2) [] == []! mapr (*2) [1..3] == [2,4,6]! take 3 (mapr (*2) [1..]) == [2,4,6]! 不要な部分は評価されない→無限リストに使える 14
15.
mapモドキ(with foldl) mapl ::
(a -> b) -> [a] -> [b]! mapl f = foldl (acc x -> acc ++ [f x]) []! ! mapl (*2) [] == []! mapl (*2) [1..3] == [2,4,6]! take 3 (mapl (*2) [1..]) …? 15
16.
(:) vs (++) ghci>
:set +s! ghci> foldr (x acc -> x : acc) [] [1..10000]! (0.19 secs, 44499728 bytes)! ghci> foldr (x acc -> acc ++ [x]) [] [1..10000]! (4.83 secs, 4335728232 bytes)! 16
17.
elem elem’ :: (Eq
a) => a -> [a] -> Bool! elem’ y ys! = foldr (x acc -> if x == y then True else acc) False ys! elem’ 3 [1..]! = 1 `f` (2 `f` (3 `f` (…)))! = 2 `f` (3 `f` (…))! = 3 `f` (…) = True 17
18.
foldrと無限リスト foldr f z
[x1, x2, ..., xn]! = x1 `f` (x2 `f` ... (xn `f` z)…)! ! 無限リストから答を取り出せる場合がある! • `f` が右辺によらない! • False && xxx! • elem’ で何か見つかったとき! • 有限個の評価でいい! • take N [y1, y2, …] 18
19.
foldr vs foldl ghci>
:set +s! ghci> sumr [1..10000000]! (2.02 secs, 1621588592 bytes)! ghci> suml [1..10000000]! (3.30 secs, 1694662448 bytes)! ghci> suml' [1..10000000] … foldl’ (正格なfoldl, see 6.2)! (0.27 secs, 969254424 bytes)! http://sikhote.wordpress.com/2010/12/01/foldr-vs-foldl-a-small-survey-with-the-help-of-ghc/ http://ja.wikipedia.org/wiki/評価戦略 19
20.
foldl1,foldr1 リストからアキュムレータ初期値を取る! foldl1 :: (a
-> a -> a) -> [a] -> a! foldl1 f (x:xs) = foldl f x xs! foldl1 _ [] = error “empty list”! foldr1 も同様! 20
21.
例 reverse’ :: [a]
-> [a]! reverse’ = foldl (acc x -> x : acc) []! !! reverse’ = foldl (flip (:)) [] 21
22.
例 product’ :: (Num
a) => [a] -> a! product’ = fold (*) 1! ! filter’ :: (a -> Bool) -> [a] -> [a]! filter’ p = foldr (x acc -> if p x then x : acc else acc) []! ! last’ :: [a] -> a! last’ = foldl1 (_ x -> x) 22
23.
スキャン 中間状態すべてをリストとして返す! ghci> scanl (+)
0 [3,5,2,1]! [0,3,8,10,11]! ghci> scanr (+) 0 [3,5,2,1]! [11,8,3,1,0] 23
24.
スキャン ghci> scanl1 (acc
x ->! if x > acc then x else acc) [3,4,5,3,7,9,2,1]! [3,4,5,5,7,9,9,9] ! ghci> scanl (flip (:)) [] [3,2,1]! [[],[3],[2,3],[1,2,3]] ! ghci> take 10 (scanl1 (+) [1,3..])! [1,4,9,16,25,36,49,64,81,100] 24
25.
5.6 $ を使った関数適用 ($)
:: (a -> b) -> a -> b! f $ x = f x! ! ghci> sum (map sqrt [1..130])! 993.6486803921487! ghci> sum $ map sqrt [1..130]! 993.6486803921487! … 括弧が減ってる。! ! ghci> sum (filter (> 10) (map (*2) [2..10]))! 80! ghci> sum $ filter (> 10) $ map (*2) [2..10]! 80! 25
26.
関数 引数 f: X
-> Y <=> x: (X -> Y) -> Y! (X -> Y) x X -> Y ! ghci> (x -> 2 * x + 1) 3! 7! ghci> (x -> 2 * x + 1) $ 3! ghci> ($ 3) (x -> 2 * x + 1) … セクション! ghci> :t ($ 3)! ($ 3) :: Num a => (a -> b) -> b 26
27.
5.7 関数合成 (.) ::
(b -> c) -> (a -> b) -> a -> c! f . g = x -> f (g x)! ghci> map ((+1) . (*2)) [1..10]! [3,5,7,9,11,13,15,17,19,21]! 数式で書くと: g(x) = 2x, f(y) = y+1! => (f・g)(x) = 2x + 1 27
28.
多引数関数の関数合成 部分適用して一引数関数にできるなら関数合成で書き直せる sum (replicate 5
(max 6.7 8.9))! = (sum . replicate 5) (max 6.7 8.9)! = sum . replicate 5 $ max 6.7 8.9! ! replicate 2 (product (map (*3) (zipWith max [1,2] [4,5])))! = replicate 2 . product . map (*3) $ zipWith [1,2] [4,5] 28
29.
ポイントフリースタイル sum’ :: (Num
a) => [a] -> a! sum’ xs = foldl (+) 0 xs! ! 関数はカリー化されており、引数を省略できる! sum’ = foldl (+) 0 29
30.
第5章 高階関数(まとめ) • 再帰 •
foldr、foldl など … 畳み込み(5.5) • filter、take など … map,filter(5.3) カリー化関数(5.1)、高階実演(5.2) λ(5.4)、 $(5.6)、 .(5.7) 30
31.
Exercise 1 or’ ::
[Bool] -> Bool! を foldr を使って定義せよ • or’ [] == False! • or’ [True] == True! • or’ [False] == False! • or’ [False, True] == True! • or’ (repeat True) == True 31
32.
Exercise 2 concat’ ::
[[a]] -> [a] を畳み込みを使って定義せよ • concat [] == [] • concat [[1,2,3],[4,5,6]] == [1,2,3,4,5,6] • concat [[[1,2,3],[4,5,6]]] == [[1,2,4],[4,5,6]] • take 3 $ concat $ map (:[]) [1..] == [1,2,3] 32
33.
Exercise 3 隣接した重複を取り除く関数remdupsを定義せよ remdups ::
Eq a => [a] -> [a]! • remdups [1,1,2,2,3,3] == [1,2,3]! • remdups [1,1,2,2,1,1] == [1,2,1]! • take 3 $ remdups [1..] == [1,2,3] 33
Download