Clojureでのポリモーフィズム

ウェブ技術 デジタルトランスフォーメーション技術 人工知能技術 自然言語処理技術 セマンティックウェブ技術 深層学習技術 オンライン学習&強化学習技術 チャットボットと質疑応答技術 ユーザーインターフェース技術 知識情報処理技術 推論技術  Clojure プログラミング

前回ClojureでのOOPとしてクラスの扱いについて述べた。今回はOOPのもう一つの特徴であるポリモーフィズム(Polymorphism)について述べる。ポリモーフィズムとはwikiによると「プログラミング言語型システムの性質を表すもので、プログラミング言語の各要素(定数変数オブジェクト関数メソッドなど)についてそれらが複数の型に属することを許すという性質を指す。ポリモルフィズム、多態性、多相性、多様性とも呼ばれる。対義語はモノモーフィズム (Monomorphism)、単態性、単相性で、プログラミング言語の各要素が唯一つの型に属するという性質を指す。」と非常に難しい表現で定義されている。

モノモーフィズムは、関数や手続きがそれぞれ一意に識別される名前と結びつくことを意味する。つまり異なった動作を実現するために異なった名前を用いるということになる。これと対義語になるポリモーフィズムは、異なった動作を実現するのに同じ名前を用いるという定義になる。

これを具体的にClojureのコードで見ていく。まずモノモーフィズムなコードとしては以下のようになる。

(defn freee-amount [percentage user]
   (float (* 0.01 percentage (:salary user))))
(defn affiliate-free-cond [user]
   (cond
      (= :google.com (:refer user)) (free-amount 0.01 user)
      (= :mint.com (:refer user)) (free-amount 0.03 user)
      :default (free-amount 0.02 user)))

異なる機能を実現する為に分岐を内包した関数となる。これに対してdefmultiとdefmethodを用いたポリモーフィズムなコードは以下となる。

(defmulti affiliate-fee :referrer)
(defmethod affiliate-fee :mint.com [user]
  (fee-amount 0.03 user))
(defmethod affiliate-fee :google.com [user]
  (fee-amount 0.01 user))
(defmethod affiliate-fee :default [user]
  (fee-amount 0.02 user))

(def user-1 {:login "rob" :referrer :mint.com :salary 100000})
(def user-2 {:login "kyle" :referrer :google.com :salary 90000})
(def user-3 {:login "celeste" :referrer :yahoo.com :salary 70000})

(affiliate-fee user-1)
;;->30.0
(affiliate-fee user-2)
;;->9.0
(affiliate-fee user-3)
;;->14.0

上記は単一の関数名であるaffiliate-freeをdefmulti関数で定義し、それぞれのバリエーションをdefmethodで定義している。これらにより、異なった属性値を持つクラスuser-1,user-2,user-3をそれぞれの場合に分けて一括で処理することが利用可能になる。これはOOPの視点で言うと異なるクラス間の類似したメソッドの名前を統一した」になる。

コメント

  1. […] ポリモーフィズム Clojureでの型システムの活用 […]

タイトルとURLをコピーしました