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
Go1.25からのGOMAXPROCS
kuro_kurorrr
1
800
ruby.wasmで多人数リアルタイム通信ゲームを作ろう
lnit
2
250
なぜ適用するか、移行して理解するClean Architecture 〜構造を超えて設計を継承する〜 / Why Apply, Migrate and Understand Clean Architecture - Inherit Design Beyond Structure
seike460
PRO
1
660
プロダクト志向ってなんなんだろうね
righttouch
PRO
0
150
設計やレビューに悩んでいるPHPerに贈る、クリーンなオブジェクト設計の指針たち
panda_program
6
1.2k
Haskell でアルゴリズムを抽象化する / 関数型言語で競技プログラミング
naoya
17
4.9k
なぜ「共通化」を考え、失敗を繰り返すのか
rinchoku
1
480
KotlinConf 2025 現地で感じたServer-Side Kotlin
n_takehata
1
230
XSLTで作るBrainfuck処理系
makki_d
0
210
DroidKnights 2025 - 다양한 스크롤 뷰에서의 영상 재생
gaeun5744
3
310
生成AIコーディングとの向き合い方、AIと共創するという考え方 / How to deal with generative AI coding and the concept of co-creating with AI
seike460
PRO
1
330
Beyond Portability: Live Migration for Evolving WebAssembly Workloads
chikuwait
0
390
Featured
See All Featured
Building a Modern Day E-commerce SEO Strategy
aleyda
41
7.3k
Reflections from 52 weeks, 52 projects
jeffersonlam
351
20k
Measuring & Analyzing Core Web Vitals
bluesmoon
7
490
The Straight Up "How To Draw Better" Workshop
denniskardys
233
140k
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
10
930
Building an army of robots
kneath
306
45k
How to Ace a Technical Interview
jacobian
277
23k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
33
5.9k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
Faster Mobile Websites
deanohume
307
31k
How to train your dragon (web standard)
notwaldorf
92
6.1k
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