Theo thông số F # (xem §6.5.7), đơn giản cho các vòng bị giới hạn bởi số nguyên (int
aka int32
aka System.Int32
) giới hạn start
và stop
, ví dụ:Tại sao đơn giản cho các biểu thức vòng lặp được giới hạn trong phạm vi số nguyên?
for i = start to stop do
// do sth.
Tôi tự hỏi tại sao giới hạn lặp lại cho loại vòng lặp này được yêu cầu là int32
. Tại sao không cho phép uint32
? int64
? bigint
?
Tôi biết rằng các biểu thức lặp tuần tự (for ... in ...
) có thể lặp qua các chuỗi tùy ý; tuy nhiên yêu cầu phân bổ một iterator và gọi MoveNext
và Current
và những gì không và do đó có thể được ít hơn đáng kể hiệu quả hơn một vòng lặp đơn giản có thể được (tăng truy cập, so sánh, nhảy conditonal). Để tránh điều đó, bạn đang bị mắc kẹt với việc sử dụng while
và một tay incrementing quầy loop ...
Lạ lùng thay, F # không phép phi int32
giới hạn vòng lặp, nếu biểu thức for
được bọc trong một biểu thức chuỗi, ví dụ
seq { for i = 0I to 10I do
printfn "%A" i }
Vì vậy, tôi đoán câu hỏi là: Có lý do cụ thể để chỉ cho phép int32
cho vòng lặp không? Và tại sao hạn chế này không áp dụng cho các vòng for
được bao bọc trong các biểu thức seq
?
Nói chung, khuôn khổ NET sử dụng 'int' như một số nguyên có mục đích chung, bao gồm cả việc sử dụng nó trong tất cả các loại tình huống lập chỉ mục số. Ví dụ: http://msdn.microsoft.com/en-us/library/system.array.indexof(v=vs.71).aspx. Ví dụ truy cập: http://msdn.microsoft.com/en-us/library/system.io.filestream.position.aspx, sử dụng từ lâu. –
F # khuyến khích lập trình hàm và do đó dừng ngắn hỗ trợ bắt buộc đầy đủ (ví dụ: thiếu 'break' /' return'). Trong biểu thức tính toán 'for' được desugared vào một cuộc gọi phương thức, vốn không phải là bắt buộc như một vòng lặp, và do đó không có cùng giới hạn. Tôi có thể hiểu được bí ẩn. +1 – Daniel
@Daniel +1 "Trong biểu thức tính toán cho được desugared vào một cuộc gọi phương thức". Tôi hiểu rồi; trên thực tế, mã được tạo cho 'seq {for .. to .. do ..}' và 'seq {cho .. trong .. do}' hầu như giống hệt nhau, cả hai được chuyển thành một bộ đếm 'GeneratedSequenceBase <_>'. – Frank