ağır basan (... .) işleci
@ kvb'nin yanıtında olduğu gibi (.. ..)
operatörünü yeniden tanımladıysanız, bu işleç her türden geçersiz kılacaktır. Muhtemelen (.. ..)
operatörünün özel bir veri türü için çalışmasını istiyorsanız, statik (+)
ve One
üyelerini geçersiz kılmak yeterlidir. Örneğin, aşağıda @Tomas's blog alınan modüler aritmetik için özel sayısal türüdür:
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)
(+)
ve One
sonraki maddeyi bulmak için kullanılır, alt sınır bir dizi başlangıç inşa ederken. Bir sonraki elemanın menzilin üst sınırına eşit veya bu sınırı aştığı zaman, inşaat tamamlanır. Artık herhangi aralık ifadesinde IntegerZ5
istihdam edebilirsiniz:
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]
Kullanma (.. ..) operatörü
aralığı ifade Başka bir kullanım for
döngüler bulunmaktadır.Ben yararlı birçok durumda bulabilirsiniz:
let sum =
let mutable s = 0L
for i in 1L..1000L do (* or 1L..1L..1000L with an explicit step *)
s <- s + i
s
sadece int
sınırlıdır for...to..do
daha esnektir ve 1
bir adımla bir dizi ima çünkü:
let sum =
let mutable s = 0L
for i = 1L to 1000L do (* doesn't work *)
s <- s + i
s
kabul edilen yanıt olarak bu işaretleme En hızlı olduğu ve diğerlerinin daha fazla bilgi içermediği için. “(.. ..)' sadece “seq {...}' içinde yaşayabilir gibi görünüyor. - Benim için spec okumak için teşekkürler ;-) – uhrm