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
490
継続的リファクタリングの工数を確保できる理由 / RAKUS Meetup Osaka 2020-02-05
koheisakata
2
930
チャットディーラーの高速開発を支えるLaravel / laraveljpcon ChatDealer Rapid Development with Laravel
koheisakata
2
2.3k
チャットディーラーの高速開発を支えるLaravel / phpkansai 2018 ChatDealer Rapid Development with Laravel
koheisakata
3
5.4k
Other Decks in Programming
See All in Programming
202507_ADKで始めるエージェント開発の基本 〜デモを通じて紹介〜(奥田りさ)The Basics of Agent Development with ADK — A Demo-Focused Introduction
risatube
PRO
6
1.4k
「リーダーは意思決定する人」って本当?~ 学びを現場で活かす、リーダー4ヶ月目の試行錯誤 ~
marina1017
0
160
Flutterと Vibe Coding で個人開発!
hyshu
1
230
MCP連携で加速するAI駆動開発/mcp integration accelerates ai-driven-development
bpstudy
0
280
SQLアンチパターン第2版 データベースプログラミングで陥りがちな失敗とその対策 / Intro to SQL Antipatterns 2nd
twada
PRO
38
11k
AIに安心して任せるためにTypeScriptで一意な型を作ろう
arfes0e2b3c
0
340
技術的負債で信頼性が限界だったWordPress運用をShifterで完全復活させた話
rvirus0817
0
450
Vibe Codingの幻想を超えて-生成AIを現場で使えるようにするまでの泥臭い話.ai
fumiyakume
21
10k
「次に何を学べばいいか分からない」あなたへ──若手エンジニアのための学習地図
panda_program
3
720
LLMは麻雀を知らなすぎるから俺が教育してやる
po3rin
3
2k
中級グラフィックス入門~効率的なメッシュレット描画~
projectasura
4
2.5k
階層化自動テストで開発に機動力を
ickx
1
480
Featured
See All Featured
Making Projects Easy
brettharned
117
6.3k
The Invisible Side of Design
smashingmag
301
51k
Product Roadmaps are Hard
iamctodd
PRO
54
11k
Building a Scalable Design System with Sketch
lauravandoore
462
33k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.5k
Building Flexible Design Systems
yeseniaperezcruz
328
39k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
332
22k
How GitHub (no longer) Works
holman
314
140k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
30
2.2k
Java REST API Framework Comparison - PWX 2021
mraible
33
8.8k
GitHub's CSS Performance
jonrohan
1031
460k
Art, The Web, and Tiny UX
lynnandtonic
301
21k
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