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
1.1k
Haskellでオブジェクト指向プログラミング
株式会社ラクス主催の「オブジェクト指向LT会 vol.4」で発表したスライド
https://rakus.connpass.com/event/247348/
坂田晃平
June 30, 2022
Tweet
Share
More Decks by 坂田晃平
See All by 坂田晃平
PHP でプロファイリングしてみた
koheisakata
1
1.3k
FastAPI はいいぞ
koheisakata
0
510
継続的リファクタリングの工数を確保できる理由 / RAKUS Meetup Osaka 2020-02-05
koheisakata
2
990
チャットディーラーの高速開発を支えるLaravel / laraveljpcon ChatDealer Rapid Development with Laravel
koheisakata
2
2.5k
チャットディーラーの高速開発を支えるLaravel / phpkansai 2018 ChatDealer Rapid Development with Laravel
koheisakata
3
5.6k
Other Decks in Programming
See All in Programming
從冷知識到漏洞,你不懂的 Web,駭客懂 - Huli @ WebConf Taiwan 2025
aszx87410
2
3.3k
Combinatorial Interview Problems with Backtracking Solutions - From Imperative Procedural Programming to Declarative Functional Programming - Part 2
philipschwarz
PRO
0
130
re:Invent 2025 トレンドからみる製品開発への AI Agent 活用
yoskoh
0
570
AI Agent Tool のためのバックエンドアーキテクチャを考える #encraft
izumin5210
6
1.5k
TestingOsaka6_Ozono
o3
0
260
GISエンジニアから見たLINKSデータ
nokonoko1203
0
190
AIの誤りが許されない業務システムにおいて“信頼されるAI” を目指す / building-trusted-ai-systems
yuya4
7
4.2k
AtCoder Conference 2025「LLM時代のAHC」
imjk
2
640
HTTPプロトコル正しく理解していますか? 〜かわいい猫と共に学ぼう。ฅ^•ω•^ฅ ニャ〜
hekuchan
2
600
LLM Çağında Backend Olmak: 10 Milyon Prompt'u Milisaniyede Sorgulamak
selcukusta
0
140
Denoのセキュリティに関する仕組みの紹介 (toranoana.deno #23)
uki00a
0
210
Spinner 軸ズレ現象を調べたらレンダリング深淵に飲まれた #レバテックMeetup
bengo4com
1
210
Featured
See All Featured
Between Models and Reality
mayunak
1
160
Amusing Abliteration
ianozsvald
0
82
sira's awesome portfolio website redesign presentation
elsirapls
0
110
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
0
120
エンジニアに許された特別な時間の終わり
watany
106
220k
Unsuck your backbone
ammeep
671
58k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
0
3.4k
New Earth Scene 8
popppiees
0
1.3k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
74
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.4k
How to make the Groovebox
asonas
2
1.9k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.7k
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