Les fonctions génériques types de paramètres
Je suis à essayer de comprendre comment définir une fonction qui fonctionne sur plusieurs types de paramètres (par exemple int et int64). Comme je le comprends, de surcharge de fonctions n'est pas possible en F# (certainement le compilateur se plaint). Prenons par exemple la fonction suivante.
let sqrt_int = function
| n:int -> int (sqrt (float n))
| n:int64 -> int64 (sqrt (float n))
Le compilateur de cours se plaint de ce que la syntaxe n'est pas valide (type de contraintes dans la correspondance de modèle ne sont pas pris en charge il me semble), mais je pense que cela illustre ce que j'aimerais réaliser: une fonction qui fonctionne sur plusieurs types de paramètre et renvoie une valeur de la fonction type. J'ai le sentiment que c'est possible dans F# à l'aide d'une combinaison de types génériques/l'inférence de type/modèle de l'appariement, mais la syntaxe a m'a échappé. J'ai aussi essayé d'utiliser le 😕 opérateur (dynamique des essais de type) et quand clauses dans le filtrage bloc, mais ce produit encore toutes sortes d'erreurs.
Que je suis un peu nouveau pour la langue, je peux très bien être en train d'essayer de faire quelque chose d'impossible, ici, de sorte s'il vous plaît laissez-moi savoir si y est solution de rechange.
Vous devez vous connecter pour publier un commentaire.
La surcharge est généralement la bugaboo de type inferenced langues (au moins lorsque, comme F#, le type de système n'est pas assez puissant pour contenir type-classes). Il y a un certain nombre de choix que vous avez en F#:
Pour votre exemple, je serais probablement juste utiliser la surcharge de méthode:
Cela fonctionne:
Il utilise statique des contraintes et de la surcharge, ce qui rend une compilation de recherche sur le type de l'argument.
La statique des contraintes sont générées automatiquement en présence d'un opérateur (opérateur
$
dans ce cas), mais il peut toujours être écrite à la main:Plus sur ce ici.
float
qui est moins de code, mais si vous voulez travailler avec de grands entiers, vous pouvez exécuter une limitation.Oui, cela peut être fait. Jetez un oeil à cette hubFS fil.
Dans ce cas, la solution serait:
Mise en garde: non type de compilation vérification. I. e.
sqrt_int "blabla"
compile bien, mais vous obtiendrez un FormatException au moment de l'exécution.(# "" x : 'b #)
bête? Le compilateur me dit, que de construire est obsolète et doit être utilisé uniquement dans la bibliothèque F#. Et bonne chance à googler pour(#
...Voici une autre façon à l'aide d'exécution type de contrôles...
De ne pas prendre loin de la bonne réponses déjà fournies, mais vous pouvez en fait utiliser les contraintes de type de pattern matching. La syntaxe est la suivante:
Ou si vous souhaitez combiner la vérification du type et de la coulée:
match box variable with