Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Haskellでオブジェクト指向プログラミング
Search
坂田晃平
June 30, 2022
Programming
2
1k
Haskellでオブジェクト指向プログラミング
株式会社ラクス主催の「オブジェクト指向LT会 vol.4」で発表したスライド
https://rakus.connpass.com/event/247348/
坂田晃平
June 30, 2022
Tweet
Share
More Decks by 坂田晃平
See All by 坂田晃平
PHP でプロファイリングしてみた
koheisakata
0
1.1k
FastAPI はいいぞ
koheisakata
0
480
継続的リファクタリングの工数を確保できる理由 / RAKUS Meetup Osaka 2020-02-05
koheisakata
2
920
チャットディーラーの高速開発を支えるLaravel / laraveljpcon ChatDealer Rapid Development with Laravel
koheisakata
2
2.3k
チャットディーラーの高速開発を支えるLaravel / phpkansai 2018 ChatDealer Rapid Development with Laravel
koheisakata
3
5.3k
Other Decks in Programming
See All in Programming
Advanced Micro Frontends: Multi Version/ Framework Scenarios @WAD 2025, Berlin
manfredsteyer
PRO
0
220
おやつのお供はお決まりですか?@WWDC25 Recap -Japan-\(region).swift
shingangan
0
140
Python型ヒント完全ガイド 初心者でも分かる、現代的で実践的な使い方
mickey_kubo
1
130
PHPで始める振る舞い駆動開発(Behaviour-Driven Development)
ohmori_yusuke
2
400
git worktree × Claude Code × MCP ~生成AI時代の並列開発フロー~
hisuzuya
1
580
イベントストーミング図からコードへの変換手順 / Procedure for Converting Event Storming Diagrams to Code
nrslib
2
850
Hack Claude Code with Claude Code
choplin
4
2.2k
“いい感じ“な定量評価を求めて - Four Keysとアウトカムの間の探求 -
nealle
2
11k
Is Xcode slowly dying out in 2025?
uetyo
1
280
Team operations that are not burdened by SRE
kazatohiei
1
310
生成AI時代のコンポーネントライブラリの作り方
touyou
1
230
Deep Dive into ~/.claude/projects
hiragram
14
2.6k
Featured
See All Featured
KATA
mclloyd
30
14k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
Done Done
chrislema
184
16k
A designer walks into a library…
pauljervisheath
207
24k
Agile that works and the tools we love
rasmusluckow
329
21k
Designing Experiences People Love
moore
142
24k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
120k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
10
960
Become a Pro
speakerdeck
PRO
29
5.4k
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
Why Our Code Smells
bkeepers
PRO
336
57k
Transcript
Haskellで オブジェクト指向プログラミング 株式会社ラクス 坂田晃平 オブジェクト指向LT会 vol.4 2022-06-29 #ooltjp
自己紹介 名前: 坂田晃平(HN: amderbar) 所属: (株)ラクス チャットディーラー開発課 よく使うプログラミング言語 仕事: Python,
JavaScript, PHP 趣味: Haskell, PureScript, F# #ooltjp 2
自己紹介 OOPとの関わり 入社後のJava研修でちょっとやったかな?程度 仕事で書いたコードは手続き 趣味で書くコードは関数 仕事で書くコードはオブジェクト指向にしたい が、それはさておき。 #ooltjp 3
Haskellで オブジェクト指向プログラミング 趣味の話です #ooltjp 4
contents Haskellとは オブジェクト指向とは オブジェクトとは HaskellでOOP 典型的OOPとの対応 まとめ 参考 その他のトピック #ooltjp
5
Haskellとは 静的型付きプログラミング言語 純粋関数型、遅延評価 圏論のアイデアを利用(関手、モナド、自然変換) 純粋関数だけでシステムを構成する 文ではなく式、ループ構文がない、再帰関数、高階関数 -- | 階乗を求める関数 factorial
0 = 1 factorial n = n * factorial (n - 1) #ooltjp 6
オブジェクト指向とは オブジェクトでシステムを構成する考え方 すべてはオブジェクト オブジェクトはメッセージの送受信で相互作用する オブジェクトは内部状態を持つ #ooltjp 7
オブジェクト指向と関数型プログラミング オブジェクトでシステムを構成⇔関数でシステムを構成 しばしば対比される オブジェクト指向と関数型のマルチパラダイム オブジェクト指向と関数型の使い分け オブジェクト指向と関数型プログラミングは相容れない #ooltjp 8
オブジェクト指向と関数型プログラミング オブジェクトでシステムを構成⇔関数でシステムを構成 オブジェクト指向と関数型プログラミングは相容れない ほんとうに? #ooltjp 9
オブジェクト指向とは オブジェクトでシステムを構成する考え方 すべてはオブジェクト オブジェクトはメッセージの送受信で相互作用する オブジェクトは内部状態を持つ #ooltjp 10
オブジェクト指向と関数型プログラミング オブジェクトでシステムを構成⇔関数でシステムを構成 オブジェクト指向と関数型プログラミングは相容れない オブジェクトを純粋関数で表せば、 HaskellでOOPできるやん? #ooltjp 11
オブジェクトとは つまりオブジェクトは次の二つの性質を併せ持つもの メッセージ変換器 = 自然変換 ∀ x. M x →
N x 状態機械 = 状態モナドとそれ上の関数 内部状態とメソッドを持ち、メッセージを受け取るとメソッドが 起動され、アクションを返すとともに、その内部状態が変化しう る概念 (参考3より引用) “ “ #ooltjp 12
HaskellでOOP objectiveパッケージを紹介する -- | Defined in `Control.Object.Object' newtype Object f
g = Object {runObject :: forall x. f x -> g (x, Object f g)} を目的として作成されたパッケージ 拡張性のある状態の管理手法を導入し、OOP に相当する記述力を Haskell で獲得すること (参考3より引用) “ “ #ooltjp 13
サンプルプログラム main :: IO () main = do -- インスタンス生成
cnt <- new $ counter 0 -- メソッド呼び出し cnt.-Increment () cnt.-Increment () -- 結果の取得 ret <- cnt.-GetValue () print ret > stack run # プログラム実行 2 #ooltjp 14
サンプルプログラム -- | Counterインターフェース data Counter a where Increment ::
() -> Counter () GetValue :: () -> Counter Int -- | シンプルなカウンタオブジェクトのコンストラクタ -- Counterインターフェースを実装 counter :: Int -> Object Counter IO counter s = s @~ \case Increment _ -> modify (+ 1) GetValue _ -> get #ooltjp 15
典型的OOPとの対応 典型的OOP 関数型OOP プログラム IO 型の値 クラス Object M IO
型の値の定義 インスタンス Object M IO 型の参照 コンストラクタ Object M IO を生成する関数 インターフェース M (参考4より抜粋) #ooltjp 16
典型的OOPとの対応 典型的OOP 関数型OOP メソッド M 型の値 フィールド get : M
s と set : s → M () の存在 継承 Object M' M との合成 オーバーライド Object M' M の実装の一例 カプセル化 メソッド以外のアクセス手段なし (参考4より抜粋) #ooltjp 17
まとめ Question. オブジェクト指向と関数型プログラミングは相容れないのか? Answer. (参考4より引用) オブジェクト指向は、関数型プログラミン グと相容れない何かではなく、実装するも のだ。 “ “
#ooltjp 18
参考 1. オブジェクト指向 『ウィキペディア(Wikipedia)』 2. objective: Composable objects | Hackage
3. 木下郁章, 山本和彦, "Haskellでの合成可能なオブジェクトの構成と その応用", http://fumieval.github.io/papers/ja/2015-Haskell- objects.pdf 4. 関数型プログラミングとオブジェクト指向の抜き差し可能な関係に ついて整理して考える 5. Haskellオブジェクト指向に触れてみよう〜初級編〜 #ooltjp 19
その他のトピック 別のOOP実現策 Lensを使う方法や型クラスを使う方法も提案されている オブジェクト指向と余代数 Haskellと余代数, 朝日ネット 技術者ブログ(2022-03-14) #ooltjp 20