2013-08-31 51 views
6

Tôi gặp một chút rắc rối khi khai báo một chuỗi giảm dần là int64.Tại sao trình biên dịch F # bị biến đổi với seq {0L ..- 5L ..- 10L}?

Những gì tôi muốn đây là:

seq{0L..-5L..-10L};; 

Tuy nhiên, tôi nhận được một lỗi:

seq{0L..-5L..-10L};; 
    ---^^^^^^^^^^^^^^^ 

stdin(5,4): error FS0739: Invalid object, sequence or record expression 

Điều thú vị là, nó hoạt động với đồng bằng int:

> seq{0..-5..-10};; 
val it : seq<int> = seq [0; -5; -10] 

Thậm chí nhiều hơn thú vị, nếu tôi đặt khoảng cách giữa .., nó sẽ bắt đầu hoạt động với int64 quá:

> seq{0L .. -5L .. -10L};; 
val it : seq<int64> = seq [0L; -5L; -10L] 

Ai đó có thể giải thích tại sao các trình biên dịch được vào các xoắn với seq{0L..-5L..-10L}?

Trả lời

6

Tôi đồng ý rằng đây là hành vi hơi lạ. Nó thường được đề nghị (mặc dù điều này không được yêu cầu nghiêm ngặt bởi đặc điểm kỹ thuật) để viết không gian xung quanh .. và nó hoạt động chính xác trong trường hợp đó. Vì vậy, tôi khuyên bạn nên sử dụng:

seq { 0 .. -5 .. -10 } 
seq { 0L .. -5L .. -10L } 

Tại sao điều này hành xử khác nhau cho intint64? Bạn có thể nhận thấy rằng khi bạn viết 1..-21L..-2, Visual Studio sẽ tô màu văn bản khác nhau (trong trường hợp đầu tiên là .. có cùng màu với số, trong trường hợp khác, nó có cùng màu với .. có khoảng trắng).

Vấn đề là khi trình biên dịch thấy 1., nó có thể có nghĩa là một giá trị dấu phẩy động (1.0) hoặc có thể là bắt đầu 1.., vì vậy trường hợp này được xử lý đặc biệt. Đối với 1L., đây không phải là vấn đề - 1L. phải là đầu của 1L...

Vì vậy, nếu bạn viết 1..-5..-10, trình biên dịch sẽ sử dụng xử lý đặc biệt và tạo chuỗi. Nếu bạn viết 1L..-5..-10, thì trình biên dịch phân tích cú pháp ..- làm toán tử đơn nhất được áp dụng cho 5L. Viết không gian giải quyết sự mơ hồ giữa nhà điều hành đơn nhất và .. theo sau là số âm.

Để tham khảo, đây là một ảnh chụp màn hình từ Visual Studio của tôi (trong đó cho thấy 10.. trong xanh, nhưng .. trên dòng thứ hai màu vàng - không khác biệt đáng chú ý đặc biệt, nhưng họ :-) khác nhau)

enter image description here

+1

Trong Visual Studio của tôi (2012), tôi không nhận được bất kỳ sự khác biệt về màu sắc với lược đồ mặc định. Bạn đang sử dụng một số chương trình đặc biệt? –

+0

@KomradeP. Điều đó hoàn toàn có thể - tôi đã thay đổi màu sắc của các con số. Tôi đã thêm một ảnh chụp màn hình (nhưng bạn có thể cần phải phóng to, màu sắc tương tự ..) –