2012-04-18 8 views

Trả lời

12

Theo the F# specification, biểu hiện chuỗi có thể là biểu hiện tính toán bình thường (đây là trường hợp bạn viết do yield) hoặc nó có thể là một hình thức ngắn đó là cụ thể trình tự biểu thức:

seq { comp-expr } 
seq { short-comp-expr } 

Trường hợp comp-expr bao gồm các ví dụ làm việc đầu tiên và cuối cùng của bạn. Các hình thức ngắn sử dụng -> và đặc tả một cách rõ ràng nói rằng hình thức ngắn chỉ được phép là với in keyword:

short-comp-expr := 
    for pat in expr-or-range-expr -> expr  -- yield result 

Có nhiều hình thức ngắn khác mà có thể có ích trong thực tế, nhưng tôi đoán rằng mục đích là để cung cấp một cú pháp đặc biệt chỉ cho cú pháp này, rất thường xuyên, trường hợp và nếu không giữ cho đồng phục ngôn ngữ.

+2

Liên kết đến thông số kỹ thuật không còn hoạt động, bất kỳ ai cũng có thể xem [spec mới nhất] (http://fsharp.org/specs/language-spec/), phần '6.3.11 Biểu thức trình tự'. –

4

Để thêm một số chi tiết để @ câu trả lời Tomas của, ví dụ đầu tiên và thứ ba của bạn được xây dựng như:

let x = Seq.collect (fun i -> {yield i}) {1..10} 

trong khi ví dụ thứ hai của bạn được dịch sang:

let x = Seq.map (fun i -> i) {1..10} 

quy tắc dịch được đề cập trong Section 6.3.11 in the spec. Trong phần đó, bạn cũng có thể thấy rằng F # xử lý toàn bộ các vòng for (for...in...dofor...to...do) đồng nhất, nhưng cú pháp đặc biệt với -> chỉ được áp dụng cho for...in... khối.

Không có vấn đề gì vì bạn luôn có thể sử dụng for...in... để thể hiện for...to....