Как использовать полиморфизм в функциональном программировании (с системой динамического типа)?
Рассмотрим следующий пример (сначала в ООП второй в FP). Программа очень проста - есть список цифр, и нам нужно рисовать их все, разные цифры используют разные алгоритмы рисования.
В ООП это можно сделать тривиально, но как это сделать в FP? Особенно на языках с системой динамического типа, например Scheme, Clojure (без разрешения статического типа во время компиляции)?
Я создал простой код (live version http://tinkerbin.com/0C3y8D9Z, нажмите кнопку "Запустить" ). Я использовал, если /else переключился на выборку FP, но это очень плохой подход. Как такая проблема может быть решена лучше?
Образцы находятся в 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!')
})