2009-12-11 39 views
19

Tôi đang cố gắng thực hiện một số hiểu danh sách trong F #. Và tôi đã tìm thấy this.đọc danh sách trong F #

let evens n = 
    { for x in 1 .. n when x % 2 = 0 -> x } 
print_any (evens 10) 

let squarePoints n = 
    { for x in 1 .. n 
     for y in 1 .. n -> x,y } 
print_any (squarePoints 3) 

Việc đầu tiên vẫn hoạt động ok, nhưng điều thứ hai là lỗi thời. Trình biên dịch F # (1.9.7.8) mới nhất không hỗ trợ kiểu này.

Sau khi một số tìm kiếm tôi thấy việc này

let vec1 = [1;2;3] 
let vec2 = [4;5;6] 
let products = [for x in vec1 do for y in vec2 do yield x*y] 

có thể điểm một ai đó tại sao cú pháp thay đổi? Cảm ơn.

Trả lời

20
  • Lồng nhau cho các vòng yêu cầu do.

  • Bạn cần sử dụng seq {..}. Biểu mẫu {..} mà không cần seq không hoạt động nữa.

  • A when bảo vệ trong mẫu for cũng không được hỗ trợ nữa.

  • print_any something không được dùng nữa. Sử dụng printf "%A" something để thay thế.

Mã này nên làm việc:

let evens n = 
    seq { for x in 1 .. n do if x%2=0 then yield x } 
printf "%A" (evens 10) 

let squarePoints n = 
    seq { for x in 1 .. n do 
      for y in 1 .. n -> x,y } 
printf "%A" (squarePoints 3) 

Bạn vẫn có thể sử dụng -> nếu tất cả các bạn muốn làm là trả lại một giá trị duy nhất:

let vec1 = [1;2;3] 
let vec2 = [4;5;6] 
let products = [for x in vec1 do for y in vec2 -> x*y] 

Bằng cách này, tôi thấy thật thú vị khi thấy F # phát triển theo thời gian như thế nào. Quá xấu những người chấp nhận sớm có một phần đã lỗi thời sách trên kệ của họ (không phải là tôi nhớ).

+2

Vâng, những người dùng đầu tiên không có nhiều sự lựa chọn tại thời điểm đó :) – Benjol

+3

Chúng tôi cũng không sớm chấp nhận tác giả. ;-) –

Các vấn đề liên quan