++C++; // 未確認飛行 C ブログ

http://ufcpp.net/

F# とか Erlang で動的多態

leave a comment »

追記: なんか色々やってるうちに混乱したまま書いてたなぁ。全然動的じゃないや・・・

一般的な OOP 言語みたいに仮想関数テーブル使うのだけが動的多態の実現方法じゃないよって話を。

Go lang の動的多態は、多分、内部的には Erlang のものに近いんじゃないかなぁとか思ってる。

F#

F# の場合、.NET 的なクラスを書く構文も持ってるんで、そっち使う人が多いと思うけど、関数型言語的に多態をするなら以下のような感じ。

type RectangleType = { width : float; height : float }
type CircleType = { radius : float }
type Shape =
    | Rectangle of RectangleType
    | Circle of CircleType

let x = Rectangle { width = 2.0; height = 3.0 }
let y = Circle { radius = 1.41421356 }

let GetArea s =
    match s with
        | Rectangle r -> r.width * r.height
        | Circle c -> 3.14159265358979 * c.radius * c.radius

printf "%fn" (GetArea x)
printf "%fn" (GetArea y)

Union と match 文使って処理を分岐。

Erlang

Eralang の場合は以下のようにするんじゃないかな。

Rectangle = {rectangle, 2, 3}
Circle = {circle, 1.41421356}
area({rectangle, Width, Height}) –> Widgh * Height;
area({circle, Radius}) –> .314159265358979 * Radius * Radius;

area(Rectangle)
area(Circle)

  • Erlang の場合、同じ名前の関数を複数定義できて、引数のパターンマッチを自動でやってくれる
  • 小文字から始まる rectangle とか circle はアトムって呼ばれるもので、パターンマッチに使うためだけに存在する識別子
  • アトムとパターンマッチによる分岐で動的多態を実現
広告

Written by ufcpp

2009年11月12日 @ 00:46

カテゴリー: 未分類

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。