Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Haskellでオブジェクト指向プログラミング

 Haskellでオブジェクト指向プログラミング

株式会社ラクス主催の「オブジェクト指向LT会 vol.4」で発表したスライド
https://rakus.connpass.com/event/247348/

97a42cc1630ebdfdaaa8d50078a9fd3d?s=128

坂田晃平

June 30, 2022
Tweet

More Decks by 坂田晃平

Other Decks in Programming

Transcript

  1. Haskellで オブジェクト指向プログラミング 株式会社ラクス 坂田晃平 オブジェクト指向LT会 vol.4 2022-06-29 #ooltjp

  2. 自己紹介 名前: 坂田晃平(HN: amderbar) 所属: (株)ラクス チャットディーラー開発課 よく使うプログラミング言語 仕事: Python,

    JavaScript, PHP 趣味: Haskell, PureScript, F# #ooltjp 2
  3. 自己紹介 OOPとの関わり 入社後のJava研修でちょっとやったかな?程度 仕事で書いたコードは手続き 趣味で書くコードは関数 仕事で書くコードはオブジェクト指向にしたい が、それはさておき。 #ooltjp 3

  4. Haskellで オブジェクト指向プログラミング 趣味の話です #ooltjp 4

  5. contents Haskellとは オブジェクト指向とは オブジェクトとは HaskellでOOP 典型的OOPとの対応 まとめ 参考 その他のトピック #ooltjp

    5
  6. Haskellとは 静的型付きプログラミング言語 純粋関数型、遅延評価 圏論のアイデアを利用(関手、モナド、自然変換) 純粋関数だけでシステムを構成する 文ではなく式、ループ構文がない、再帰関数、高階関数 -- | 階乗を求める関数 factorial

    0 = 1 factorial n = n * factorial (n - 1) #ooltjp 6
  7. オブジェクト指向とは オブジェクトでシステムを構成する考え方 すべてはオブジェクト オブジェクトはメッセージの送受信で相互作用する オブジェクトは内部状態を持つ #ooltjp 7

  8. オブジェクト指向と関数型プログラミング オブジェクトでシステムを構成⇔関数でシステムを構成 しばしば対比される オブジェクト指向と関数型のマルチパラダイム オブジェクト指向と関数型の使い分け オブジェクト指向と関数型プログラミングは相容れない #ooltjp 8

  9. オブジェクト指向と関数型プログラミング オブジェクトでシステムを構成⇔関数でシステムを構成 オブジェクト指向と関数型プログラミングは相容れない ほんとうに? #ooltjp 9

  10. オブジェクト指向とは オブジェクトでシステムを構成する考え方 すべてはオブジェクト オブジェクトはメッセージの送受信で相互作用する オブジェクトは内部状態を持つ #ooltjp 10

  11. オブジェクト指向と関数型プログラミング オブジェクトでシステムを構成⇔関数でシステムを構成 オブジェクト指向と関数型プログラミングは相容れない オブジェクトを純粋関数で表せば、 HaskellでOOPできるやん? #ooltjp 11

  12. オブジェクトとは つまりオブジェクトは次の二つの性質を併せ持つもの メッセージ変換器 = 自然変換 ∀ x. M x →

    N x 状態機械 = 状態モナドとそれ上の関数 内部状態とメソッドを持ち、メッセージを受け取るとメソッドが 起動され、アクションを返すとともに、その内部状態が変化しう る概念 (参考3より引用) “ “ #ooltjp 12
  13. 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
  14. サンプルプログラム main :: IO () main = do -- インスタンス生成

    cnt <- new $ counter 0 -- メソッド呼び出し cnt.-Increment () cnt.-Increment () -- 結果の取得 ret <- cnt.-GetValue () print ret > stack run # プログラム実行 2 #ooltjp 14
  15. サンプルプログラム -- | 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
  16. 典型的OOPとの対応 典型的OOP 関数型OOP プログラム IO 型の値 クラス Object M IO

    型の値の定義 インスタンス Object M IO 型の参照 コンストラクタ Object M IO を生成する関数 インターフェース M (参考4より抜粋) #ooltjp 16
  17. 典型的OOPとの対応 典型的OOP 関数型OOP メソッド M 型の値 フィールド get : M

    s と set : s → M () の存在 継承 Object M' M との合成 オーバーライド Object M' M の実装の一例 カプセル化 メソッド以外のアクセス手段なし (参考4より抜粋) #ooltjp 17
  18. まとめ Question. オブジェクト指向と関数型プログラミングは相容れないのか? Answer. (参考4より引用) オブジェクト指向は、関数型プログラミン グと相容れない何かではなく、実装するも のだ。 “ “

    #ooltjp 18
  19. 参考 1. オブジェクト指向 『ウィキペディア(Wikipedia)』 2. objective: Composable objects | Hackage

    3. 木下郁章, 山本和彦, "Haskellでの合成可能なオブジェクトの構成と その応用", http://fumieval.github.io/papers/ja/2015-Haskell- objects.pdf 4. 関数型プログラミングとオブジェクト指向の抜き差し可能な関係に ついて整理して考える 5. Haskellオブジェクト指向に触れてみよう〜初級編〜 #ooltjp 19
  20. その他のトピック 別のOOP実現策 Lensを使う方法や型クラスを使う方法も提案されている オブジェクト指向と余代数 Haskellと余代数, 朝日ネット 技術者ブログ(2022-03-14) #ooltjp 20