Hier ist eine komplizierte (aber vielleicht interessante) Alternative. Wenn Sie etwas ernsthaftes schreiben, sollten Sie wahrscheinlich einen der Brians-Vorschläge verwenden, aber nur aus Neugierde habe ich mich gefragt, ob es möglich ist, einen F # -Berechnungsausdruck dafür zu schreiben. Sie können einen Typen deklarieren, die int
darstellt, die nur mit karierter Operation verwendet werden sollen:
type CheckedInt = Ch of int with
static member (+) (Ch a, Ch b) = Checked.(+) a b
static member (*) (Ch a, Ch b) = Checked.(*) a b
static member (+) (Ch a, b) = Checked.(+) a b
static member (*) (Ch a, b) = Checked.(*) a b
Dann können Sie einen Berechnungsausdruck Builder definieren (dies überhaupt nicht wirklich eine Monade ist, weil die Arten von Operationen vollständig sind nicht-Standard):
type CheckedBuilder() =
member x.Bind(v, f) = f (Ch v)
member x.Return(Ch v) = v
let checked = new CheckedBuilder()
Wenn Sie ‚binden‘ nennen wird es automatisch den gegebenen ganzzahligen Wert in eine ganze Zahl wickeln, die mit checked
Operationen verwendet werden soll, so wird der Rest des Codes +
und *
Operatoren überprüft als Mitglieder deklariert. Sie am Ende mit etwas wie folgt aus:
checked { let! a = 10000
let! b = a * 10000
let! c = b * 21
let! d = c + 47483648 // !
return d }
Dies löst eine Ausnahme, weil es auf der markierten Linie überläuft. Wenn Sie die Nummer ändern, wird ein int
Wert zurückgegeben (da das Return
Element den numerischen Wert aus dem Checked
Typ auspackt). Das ist ein bisschen verrückte Technik :-), aber ich dachte, es könnte interessant sein!
(Anmerkung checked
ist ein Stichwort für die zukünftige Verwendung reserviert, so dass Sie einen anderen Namen wählen bevorzugen)
Umgekehrt ist es möglich, in einem C# -Projekt auf alle Aussagen zum Aufrufen „geprüft“? –
@Heath Hunnicutt - Die Umkehrung kann mit Compiler-Optionen erreicht werden, entweder in der IDE oder in der Befehlszeile. –