2010-01-27 4 views
4

Fondamentalement, je veux avoir une fonction pour retourner une fonction polymorphique, quelque chose comme ceci:fonction polymorphes comme valeur de retour et la restriction de valeur dans SML

foo fun() = fn x => x

Ainsi, la fonction foo prend une valeur de l'unité de type et retourne une fonction d'identité polymorphes et le compilateur est heureux avec ça, ça me donne:

val foo = fn: unit -> 'a ->' a

mais une fois que j'appelle la fonction foo , La valeur de retour est pas ce que je pensais

val it = fn: .X1 -> .X2

peut pas généraliser en raison de la restriction de valeur il est dit, toute aide?? merci d'avance

Répondre

4

Pour des raisons techniques, vous n'êtes pas autorisé à généraliser (c'est-à-dire, rendre polymorphique) les résultats d'un appel de fonction. Le résultat d'un appel doit avoir un type monomorphe. Si tel était le cas contraire, vous pourriez renverser le système de type par le sale tour suivant:

  1. Appel ref [] et récupérer une liste de type forall 'a . 'a list ref
  2. Insérer une chaîne.
  3. supprimer une fonction

et vous y êtes: vous exécutez maintenant le contenu d'une chaîne arbitraire sous forme de code. Pas bon. En insistant pour que la valeur renvoyée par ref [] soit monomorphe, assurez-vous qu'elle peut être utilisée comme une liste de chaînes ou une liste de fonctions, mais pas les deux. Donc, cela fait partie du prix que nous payons pour la sécurité du type.

Questions connexes