Ecco un'alternativa complicata (ma forse interessante). Se stai scrivendo qualcosa di serio, probabilmente dovresti usare uno dei suggerimenti di Brians, ma solo per curiosità, mi chiedevo se fosse possibile scrivere l'espressione di calcolo F # per farlo. È possibile dichiarare un tipo che rappresenta int
che dovrebbe essere utilizzato solo con operazioni controllato:
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
Quindi è possibile definire un generatore di espressioni di calcolo (questo non è davvero una monade a tutti, perché i tipi di operazioni sono completamente non standard):
type CheckedBuilder() =
member x.Bind(v, f) = f (Ch v)
member x.Return(Ch v) = v
let checked = new CheckedBuilder()
Quando si chiama 'bind' che andrà a capo automaticamente il dato valore intero in un numero intero che deve essere utilizzato con checked
operazioni, in modo che il resto del codice utilizzerà controllato +
e *
operatori dichiarato come membri. Si finisce con qualcosa di simile:
checked { let! a = 10000
let! b = a * 10000
let! c = b * 21
let! d = c + 47483648 // !
return d }
Ciò genera un'eccezione perché si trabocca sulla linea contrassegnata. Se si modifica il numero, verrà restituito un valore int
(poiché il membro Return
scartina il valore numerico dal tipo Checked
). Questa è una tecnica un po 'pazza :-) ma ho pensato che potrebbe essere interessante!
(Nota checked
è una parola chiave riservata per uso futuro, quindi si può preferire la scelta di un altro nome)
fonte
2010-02-16 14:47:56
Al contrario, è possibile invocare "controllato" su tutte le dichiarazioni in un progetto C#? –
@Heath Hunnicutt - L'inverso può essere eseguito con le opzioni del compilatore, sia nell'IDE che nella riga di comando. –