重寫(..。 )運營商
如果您重新定義(.. ..)
運營商在@ kvb的答案,它將覆蓋任何類型的運算符。由於您可能想讓(.. ..)
運算符適用於自定義數據類型,因此覆蓋靜態(+)
和One
成員就足夠了。例如,下面是從@Tomas's blog採取模塊化運算的自定義數值類型:
type IntegerZ5 =
| Z5 of int
member z.ToInt32() =
let (Z5 n) = z in n
override z.ToString() =
sprintf "%d (mod 5)" (z.ToInt32())
static member Create(n) =
let z5 = n % 5
Z5(max ((z5 + 5) % 5) z5)
static member (+) (Z5 a, Z5 b) = IntegerZ5.Create(a + b)
static member (-) (Z5 a, Z5 b) = IntegerZ5.Create(a - b)
static member (*) (Z5 a, Z5 b) = IntegerZ5.Create(a * b)
static member Zero = Z5 0
static member One = Z5 1
let inline z5 a = IntegerZ5.Create(a)
在構建從下界,(+)
和One
用於尋找下一個元素的範圍開始。當下一個元素等於或超過範圍的上限時,結構結束。現在,您可以使用IntegerZ5
在任何範圍表達式:
let s1 = seq{z5 37..z5 3};; // seq [Z5 2; Z5 3]
let s2 = seq{z5 10..z5 22..z5 4};; // seq [Z5 0; Z5 2; Z5 4]
使用(..)運算符
範圍內表達的另一個用途是在for
循環。我發現它在很多情況下有用:
let sum =
let mutable s = 0L
for i in 1L..1000L do (* or 1L..1L..1000L with an explicit step *)
s <- s + i
s
,因爲它是更靈活的比for...to..do
這僅限於int
並意味着一個範圍內的1
步:
let sum =
let mutable s = 0L
for i = 1L to 1000L do (* doesn't work *)
s <- s + i
s
來源
2012-01-13 15:57:14
pad
標記此作爲公認的答案因爲這是最快的,所有其他人都沒有添加更多相關信息。似乎'(.. ..)'只能存在於'seq {...}'中。 - 感謝您閱讀我的規範;-) – uhrm 2012-01-14 14:10:55