More Related Content
PDF
Perl RDBMS Programming(DBI/DBIx::Sunnyのはなし) PDF
PDF
PDF
MAN OF BASH #ssmjp 2013.09.25 PDF
PDF
PDF
姫路IT系勉強会 Vol.11 第0回L-1グランプリ bash PDF
菩薩でもわかる!Rで動かすExcelアドインの作り方 What's hot
PPTX
PDF
PDF
PDF
PPTX
PPT
第7回社内勉強会「Code Sucks - 人の振り見て我が振り直せ」 PDF
PDF
PPTX
【簡単テキストマイニング】歌詞から作品世界の魅力を探る PDF
objective-c propertyの属性について PPTX
PDF
Similar to Haskell超入門 Part.2
PDF
PDF
PDF
PDF
PDF
PDF
PDF
PDF
PDF
PDF
すごいHaskell読書会 in 大阪 2週目 #5 第5章:高階関数 (2) PDF
PPT
PPTX
PPT
PDF
PDF
PDF
Introduction to Categorical Programming (Revised) ODP
PDF
PDF
Recently uploaded
PPTX
PDF
Starlink Direct-to-Cell (D2C) 技術の概要と将来の展望 PDF
Reiwa 7 IT Strategist Afternoon I Question-1 3C Analysis PDF
Reiwa 7 IT Strategist Afternoon I Question-1 Ansoff's Growth Vector PDF
さくらインターネットの今 法林リージョン:さくらのAIとか GPUとかイベントとか 〜2026年もバク進します!〜 PDF
2025→2026宙畑ゆく年くる年レポート_100社を超える企業アンケート総まとめ!!_企業まとめ_1229_3版 PDF
第21回 Gen AI 勉強会「NotebookLMで60ページ超の スライドを作成してみた」 PDF
100年後の知財業界-生成AIスライドアドリブプレゼン イーパテントYouTube配信 PDF
Haskell超入門 Part.2
- 2.
Nabe
Twitter / Facebook / Hatena
nabe256
- 4.
- 5.
Twitterの某発言から
› @rizumita: @nabetaro 関数型言語とかクロー
ジャとかが聞きたいです。話せる人がどれだけ
いるか分かりませんが…
› @nabetaro: 関数型言語というと、話したい人
がいるんじゃないかな〜(他力本願)
› @nabe256: Haskellで発表出来るかなぁ・・・
- 6.
Twitterの某発言から
› @rizumita: @nabetaro 関数型言語とかクロー
ジャとかが聞きたいです。話せる人がどれだけ
いるか分かりませんが…
› @nabetaro: 関数型言語というと、話したい人
がいるんじゃないかな〜(他力本願)
› @nabe256: Haskellで発表出来るかなぁ・・・
そんな餌で俺様が釣られクマ――(AA略
- 7.
でもクロージャは
ふいんき(←なぜか変換できない)
だけしか知らない。
なので、
関数型言語Haskellにおける
クロージャについて
それっぽい解説を。
- 8.
- 9.
クロージャ(クロージャー、closure、閉
包)はプログラミング言語における関数の
一種。引数以外の変数を実行時の環境では
なく、自身が定義された環境(静的スコー
プ)において解決することを特徴とする。
関数とそれを評価する環境のペアであると
もいえる。
(by Wikipedia)
- 10.
- 11.
典型的には、クロージャはある関数全体が
他の関数(以下、エンクロージャ)の内部
で宣言されたときに発生し、内部の関数は
エンクロージャのローカル変数(レキシカ
ル変数)を参照する。実行時に外部の関数
が実行された際、クロージャが形成される。
クロージャは内部の関数のコードとエンク
ロージャのスコープ内の必要なすべての変
数への参照からなる。
(by Wikipedia)
- 12.
- 13.
クロージャは
関数内で一時的な関数を作るための仕組み。
- 14.
- 15.
割り算を計算する関数。
div :: Double -> Double -> Double
div x y = x / y
引数を二つ取り、値を返す関数。
使い方
ghci> div 4 3
1.3333333333333333
- 16.
- 17.
div’ x y = f
where
f=x/y
fは外側のdiv’関数(エンクロージャ)の中で
定義された一時関数(クロージャ)になる。
クロージャはエンクロージャより外からは
参照出来ない。
fからは、エンクロージャの値(x,y)を参照す
ることが出来る。
- 18.
- 19.
- 20.
roots ab c =
((-b + sqrt(b*b – 4*a*c)) / (2*a),
(-b – sqrt(b*b – 4*a*c)) / (2*a))
roots’ a b c =
((-b + det) / (2*a),
(-b – det) / (2*a))
where det = sqrt(b*b – 4*a*c)
- 21.
roots ab c =
((-b + sqrt(b*b – 4*a*c)) / (2*a),
(-b – sqrt(b*b – 4*a*c)) / (2*a))
roots’ a b c =
((-b + det) / (2*a),
(-b – det) / (2*a))
where det = sqrt(b*b – 4*a*c)
共通部分をひとまとめにして、
見やすくする事が可能。
- 22.
Haskellではwhereとほぼ同じ機能を
持つものとしてletというものがある。
whereの前と後を入れ替えたようなもの
なので、読みやすさや状況によって
使い分ける。
恐らくwhereの方が一般的に使われている。
同じ名前で関数定義すると、実際にどちら
が使われているのか分かりづらい。
混ぜるな危険。
- 23.
引数の一部だけ指定して定義。
divx y = x / y
div4 = div 4
ghci> div4 3
1.3333333333333333
値を固定した関数を作る事が出来る。
これもクロージャの一種。
- 24.
定義が必ずしも必要でない書き方。
div’’’= ¥x -> ¥y -> x / y
使い方
ghci> div’’’ 4 3
1.3333333333333333
ghci> (¥x -> ¥y -> x / y) 4 3
1.3333333333333333
同じような事が出来る。
使い方によってはこれもクロージャの一種。
- 25.
- 26.
引数を二つ取り、値を返す関数について。
先程の割り算を計算する関数。
div :: Double -> Double -> Double
div x y = x / y
- 27.
引数を二つ取り、値を返す関数について。
正確には、
引数を一つ取り、
[引数を一つ取り、値を返す関数]
を返す関数。
正しい意味を解説すると難しい話に
なるので、ここでは説明はしない。
- 28.
引数や返り値について
もう少し詳しく知りたい人は
「Haskell超入門 Part.1」を見てみると
もしかしたらわかるかも。
確実に理解したい方は、
もっと詳しく丁寧に説明しているサイトが
沢山ありますのでとりあえずググれ。
- 29.
- 30.
- 31.
- 32.
- 33.