這是一個複雜的(但也許有趣)的選擇。如果你寫的東西很嚴肅,那麼你應該使用Brians的一個建議,但出於好奇,我想知道是否可以編寫F#計算表達式來完成這個任務。你可以聲明表示int
這樣一種類型,只應在檢查操作中使用:
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
然後,你可以定義一個計算表達式生成器(這是不是一個真正的單子可言,因爲類型的操作是完全非標):
type CheckedBuilder() =
member x.Bind(v, f) = f (Ch v)
member x.Return(Ch v) = v
let checked = new CheckedBuilder()
當你調用「綁定」,它會自動換行給定的整數值,應與checked
操作中使用一個整數,所以代碼的其餘部分將使用檢查+
和*
運營商宣佈爲成員。你最終會遇到這樣的問題:
checked { let! a = 10000
let! b = a * 10000
let! c = b * 21
let! d = c + 47483648 // !
return d }
這會拋出一個異常,因爲它在標記線上溢出。如果更改號碼,它將返回一個int
值(因爲Return
成員從Checked
類型中解開數字值)。這有點瘋狂的技術:-)但我認爲它可能很有趣!
(注checked
是一個關鍵字留作將來使用,所以你可能更喜歡選擇的另一個名字)
相反,是有可能調用在C#項目的所有語句「檢查」? –
@Heath Hunnicutt - 可以在IDE或命令行中使用編譯器選項完成相反的操作。 –