2010-07-20 10 views
2

Est-il possible d'utiliser la correspondance de modèle sur des fonctions spécifiées directement ou avec certains exploits qui n'impliquent pas de spécifier un type pour chaque fonction dont j'ai besoin?Correspondance avec les fonctions dans OCaml?

Juste pour mieux expliquer les choses suppose que j'ai un type comme

type BBoolOp = (bool->bool->bool)*term*term 

et suppose que les bool->bool->bool fonctions sont quelques-uns assez simple comme tout (&&)(||) ..

est-il possible de faire des choses différentes en fonction sur la fonction qui est spécifiée comme:

match bop with 
    (||) -> do something 
    | (&&) -> do something else 

Ceci ne devrait pas être possible car utiliser les fonctions ne peuvent pas être comparés, mais peut-être un exploit existe pour faire ce que je suis en train de le faire :)

Merci à l'avance

Répondre

6

La comparaison de fonctions est, comme vous le mentionnez, non prise en charge. Dans certains cas, cela peut fonctionner, mais selon ce n'est pas bon OMI.

Donc, je voudrais simplement utiliser un type de données algébriques pour résoudre ce problème. Vous pourriez être en mesure de retrouver une partie de la flexibilité du concept de correspondance de motifs (sans avoir besoin du code de correspondance de motifs pour connaître tous les opérateurs possibles) en utilisant des variantes polymorphes. Donc, soit

type BBoolOper = And | Or 
type BBoolOp = BBoolOper * term * term 

ou

type BBoolOp = [<`And | `Or] * term * term (* make opened/closed as needed *) 
2

Les fonctions peuvent être testées pour l'égalité. Assurez-vous simplement de comparer les fonctions et non les fermetures temporaires (et non avec l'appariement de motifs). Et cela rendra le code difficile à lire et fragile.

# (+) == (+);; 
- : bool = false 
# let f = (+);; 
val f : int -> int -> int = <fun> 
# f == f;; 
- : bool = true 
+2

je ne voudrais pas le faire. La définition de la langue pourrait changer à tout moment, et je ne compterais pas sur la table pour tester les fonctions dans les futures versions. –