(**)
et pown
sont deux choses différentes. Quand vous voyez (**)
, vous pouvez penser à la formule mathématique à l'aide de logarithmes. Quand vous voyez pown
, c'est juste une série de multiplications. Je comprends qu'il peut être surprenant/déroutant au premier abord, parce que la plupart des autres langues ne pas faire une telle différence (surtout parce que les entiers sont souvent implicitement converti en valeurs à virgule flottante). Même en mathématiques, il y a une petite différence: Voir l' article sur Wikipédia, la première définition ne fonctionne que pour des exposants entiers positifs.
Comme ils sont deux différents (mais relative) des choses, ils ont des signatures différentes. Voici (**)
:
^a -> ( ^b -> ^a) when ^a : (static member Pow : ^a * ^b -> ^a)
Et voici pown
:
^a -> (int -> ^a)
when ^a : (static member get_One : -> ^a) and
^a : (static member ( * ) : ^a * ^a -> ^a) and
^a : (static member ( / ) : ^a * ^a -> ^a)
Si vous créez votre propre type, vous avez seulement besoin d'avoir votre One
, (*)
, et (/)
à le faire fonctionner avec pown
. La bibliothèque va faire la boucle pour vous (il est optimisé, ce n'est pas de la naïveté O(n)).
Si vous souhaitez utiliser l' (**)
opérateur de votre type de non-valeurs intégrales, vous aurez à écrire la logique (et c'est pas le même algorithme que dans pown
).
Je pense que c'était une bonne décision de conception de séparer les deux concepts.