如何在函数式编程中使用多态性(使用动态类型系统)?
让我们考虑以下示例(首先在 OOP 中,然后在 FP 中)。该程序非常简单 - 有图形列表,我们需要绘制所有这些图形,不同的图形使用不同的绘图算法。
在 OOP 中可以轻松完成,但如何在 FP 中完成呢?特别是在具有动态类型系统的语言中,如 Scheme、Clojure(在编译时没有静态类型解析)?
我创建了简单的代码(实时版本http://tinkerbin.com/0C3y8D9Z,按“运行”按钮)。我在 FP 示例中使用了 if/else 开关,但这是一种非常糟糕的方法。如何更好地解决这样的问题?
示例是用 JavaScript 编写的,但这只是为了简单起见,如果看到任何具有动态类型系统的函数式语言的解决方案将会很有趣。
面向对象
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!')
})