関数型プログラミング(動的型システムを使用)でポリモーフィズムを使用するにはどうすればよいですか?
次の例を考えてみましょう(最初はOOPで、2番目はFPで)。プログラムは非常に単純です-図のリストがあり、それらすべてを描画する必要があります。異なる図は異なる描画アルゴリズムを使用します。
OOPでは簡単に実行できますが、FPで実行するにはどうすればよいですか?特に、Scheme、Clojure(コンパイル時に静的型を解決しない)のような動的型システムを備えた言語では?
簡単なコードを作成しました(ライブバージョンhttp://tinkerbin.com/0C3y8D9Z、「実行」ボタンを押します)。FPサンプルでif/elseスイッチを使用しましたが、これは非常に悪いアプローチです。どのようにしてそのような問題をよりよく解決することができますか?
サンプルはJavaScriptで作成されていますが、これは単純化を目的としたものであり、動的型付けシステムを備えた関数型言語でソリューションを確認することは興味深いことです。
OOP
var print = function(message){document.write(message + "\n<br/>")}
// Object Oriented Approach.
var circle = {
draw: function(){print("drawing circle ...")}
}
var rectangle = {
draw: function(){print("drawing rectangle ...")}
}
var objects = [circle, rectangle]
objects.forEach(function(o){
o.draw()
})
FP
var print = function(message){document.write(message + "\n<br/>")}
// Functional Approach.
var circle = {type: 'Circle'}
var drawCircle = function(){print("drawing circle ...")}
var rectangle = {type: 'Rectangle'}
var drawRectangle = function(){print("drawing rectangle ...")}
var objects = [circle, rectangle]
objects.forEach(function(o){
if(o.type == 'Circle') drawCircle(o)
else if(o.type == 'Rectangle') drawRectangle(o)
else throw new Error('unknown type!')
})