tôi nhận thấy rằng đoạn mã sau đưa ra một thông báo lỗi khi bạn cố gắng để biên dịch nó:Tại sao trình xây dựng tính toán seq không cho phép "cho phép!"
let xx =
seq {
let! i = [ 1; 2 ]
let! j = [ 3; 4 ]
yield (i,j)
}
Các lỗi này sẽ cho là "lỗi FS0795: '! Hãy để x = coll' Việc sử dụng trong các biểu thức chuỗi là không Sử dụng 'for x in coll' thay thế. "Thông báo này tất nhiên là rõ ràng và thể hiện cách khắc phục nó; mã cố định sẽ là:
let xx =
seq {
for i in [ 1; 2 ] do
for j in [ 3; 4 ] do
yield (i,j)
}
Câu hỏi của tôi không phải là cách khắc phục điều này, nhưng tại sao "cho phép!" không được phép trong các biểu thức trình tự ở nơi đầu tiên? Tôi có thể thấy thực tế là như thế nào! lặp lại qua một biểu thức có thể gây ngạc nhiên cho một số người, nhưng điều đó không đủ để không cho phép cấu trúc. Tôi cũng thấy cách "for" mạnh hơn ở đây, như phiên bản với "let!" bakes trong phạm vi của iteration là "cho đến khi kết thúc của biểu thức trình tự".
Tuy nhiên, việc có thể lặp qua một chuỗi mà không cần phải thụt lề mã là chính xác những gì tôi đang tìm kiếm (để duyệt qua cấu trúc cây). Tôi cho rằng để có được ngữ nghĩa này, tôi sẽ phải tạo một trình tạo biểu thức mới hoạt động chủ yếu giống như trình tạo biểu thức "seq", nhưng cho phép "cho phép!" cho lặp lại, phải không?
gia tăng, dựa trên nhận xét của Brian bên dưới, cung cấp giải pháp cho vấn đề tiềm ẩn của tôi:
Tôi đã không nhận ra sự thụt vào trong cho khối là không cần thiết, và lần thứ hai mẫu có thể được viết lại là:
let xx =
seq {
for i in [ 1; 2 ] do
for j in [ 3; 4 ] do
yield (i,j)
}
... loại bỏ sự thụt đầu dòng ngày càng tăng khi di chuyển qua cấu trúc cây. Cú pháp thậm chí cho phép báo cáo bổ sung trong giữa cho báo cáo mà không đòi hỏi thêm thụt đầu dòng, như trong:
let yy =
seq {
for i in [ 1; 2 ] do
let i42 = i+42
for j in [ 3; 4 ] do
yield (i42,j)
}
Bây giờ, nếu duy nhất tôi có thể tìm ra lý do tại sao tôi nghĩ rằng các báo cáo này sẽ đòi hỏi thụt đầu dòng ...
sự nhầm lẫn có thể xảy ra với 'cho phép! 'Trong các liên kết không đồng bộ - chúng ta có cú pháp giống hệt nhau làm những việc hoàn toàn khác nhau? –
Bạn đã thử 'vì không có indents? – Brian
@Brian "Bạn đã thử 'vì không có indents?" - Không, vì một lý do nào đó mà tôi không nhận ra được các indents trong 'for's là không cần thiết. Cám ơn vì sự gợi ý! Nói đúng ra nó không trả lời câu hỏi, nhưng cung cấp một công việc có thể chấp nhận được, vì vậy theo cách nó trả lời câu hỏi của tôi. –