Ist es irgendwie möglich, eine Pow-Funktion für Maßtypen zu erstellen?
Die pow-Funktion in f # benötigt nur int
als Parameter und die pow-Funktion in der Klasse Math
benötigt float
- aber dosent erlaubt float<cm>
.
Ich dachte zuerst:
%Vor%könnte funktionieren, aber es ist offensichtlich, dass jedes Mal, wenn es auf die Else-Zeile trifft, der Rückgabetyp geändert wird.
Irgendwelche Vorschläge?
Ankur hat Recht - Sie können das nicht tun (ohne auf Hacks zurückzugreifen, die Einheiten zerstören würden).
Vielleicht ist eine klarere Beschreibung des Problems, dass der Typ von pow
function vom Wert des Arguments abhängt und F # dies nicht erlaubt. Sie könnten sich vorstellen, dass dies funktionieren würde, wenn Sie nur Literale als zweites Argument verwenden würden, aber es würde schwierig werden, Ausdrücke zu verwenden:
Im zweiten Fall müsste der Wert n
im Typ erscheinen!
Sie können einige fiese Tricks verwenden (inspiriert von diesem Haskell Artikel ), aber es wird ein bisschen verrückt. Anstatt numerische Literale zu verwenden, verwenden Sie etwas wie S(S(S(N)))
, um die Zahl 3
darzustellen. Auf diese Weise können Sie die Nummer in den Typ bringen. Wahrscheinlich möchten Sie das nicht, aber hier ist ein Beispiel:
BEARBEITEN: Ich habe den Quellcode in F # -Snippets gestellt, damit Sie die abgeleiteten Typen sehen können: Ссылка
Ich glaube nicht, dass das möglich ist. Sie fordern die Funktion auf, <cm^2>
zurückzugeben, wenn die Leistung bei 2 ist, und <cm^3>
bei 3 und so weiter. Das macht die Funktion, verschiedene "Typen" zurückzugeben, basierend auf der Berechnung, die offensichtlich in einem statischen Typ nicht möglich ist und eine sichere Sprache gibt. Leider glaube ich nicht, dass Maßeinheiten zu "Generika" gemacht werden können, um das weiter zu erreichen.
Ihre Funktion kann nur einen statischen Rückgabetyp haben.
Wie gesagt, Sie können nicht. Wenn y
zur Kompilierzeit nicht bekannt ist, ist es nicht möglich, den Ausdruck in F # type system zu überprüfen.
Ich vermute, Sie werden myPow nur mit ein paar kleinen und bekannten Konstanten benutzen. In diesem Fall könnten Sie stattdessen die folgenden Funktionen verwenden und die statische Eingabe beibehalten:
%Vor%Tags und Links f#