Comment utiliser le polymorphisme en programmation fonctionnelle (avec système de type dynamique)?Comment utiliser le polymorphisme dans la programmation fonctionnelle?
Considérons l'exemple suivant (d'abord dans OOP seconde dans FP). Le programme est très simple - il y a une liste de figures et nous devons les dessiner toutes, différentes figures utilisent différents algorithmes de dessin.
Dans OOP, il peut être fait trivialement, mais comment le faire dans FP? Surtout dans les langages avec un système de type dynamique, comme Scheme, Clojure (sans type statique résolvant au moment de la compilation)?
J'ai créé un code simple (version en direct http://tinkerbin.com/0C3y8D9Z, appuyez sur le bouton 'Exécuter'). J'ai utilisé le commutateur if/else dans l'échantillon FP, mais c'est une très mauvaise approche. Comment un tel problème peut-il être mieux résolu?
Les exemples sont en JavaScript, mais c'est uniquement à des fins de simplicité, il serait intéressant de voir une solution dans n'importe quel langage fonctionnel avec un système de typage dynamique.
POO
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!')
})
J'aime votre point sur les multiméthodes, mais je ne comprends pas ce que vous obtenez avec le deuxième extrait de code préfacé par _Ou vous pouvez simplement utiliser le style fonctionnel _... – DaoWen
@DaoWen Dans la solution FP est obtenu très facilement sans supplémentaire abstractions. – mobyte
Dans ce cas, je pense que vous avez une erreur dans votre code, car cela n'a pas de sens. '(objets def [draw-circle draw-rectangle]) Où sont ces fonctions définies? – DaoWen