Tôi có chút mã này:F # trích dẫn: biến có thể thoát khỏi phạm vi
let rec h n z = if n = 0 then z
else <@ (fun x -> %(h (n - 1) <@ x + %z @>)) n @>
chuyển đổi từ một ví dụ MetaOcaml trong http://www.cs.rice.edu/~taha/publications/journal/dspg04a.pdf
Trong bài báo có được giải thích rằng ví dụ trên sẽ mang lại những điều sau với các thông số 3
và .<1>.
(trong ký hiệu MetaOcaml):
.<(fun x_1 -> (fun x_2 -> (fun x_3 -> x_3 + (x_2 + (x_1 + 1))) 1) 2) 3>.
Như bạn có thể thấy x
´s được thay thế bằng x_1
, x_2
v.v. vì x
nếu không sẽ chỉ đề cập đến số x
ở trong cùng fun
.
Nhưng trong F #, điều này không được phép. Tôi nhận được lỗi biên dịch thời gian: "Biến 'x' bị ràng buộc trong một báo giá nhưng được sử dụng như là một phần của một biểu thức nối. Điều này không được phép vì nó có thể thoát khỏi phạm vi của nó." Vì vậy, câu hỏi là: làm thế nào điều này có thể được thay đổi để nó sẽ biên dịch và có cùng ngữ nghĩa như đầu ra MetaOcaml?
Cập nhật để nhận xét: Tôi sử dụng PowerPack để thực sự đánh giá báo giá. Nhưng tôi không nghĩ rằng điều này có liên quan gì đến nó bởi vì lỗi ở thời gian biên dịch. Cho đến nay QuotationEvaluation hoạt động. Tuy nhiên, tôi biết nó có thể không được thực hiện hiệu quả nhất.
Cập nhật câu trả lời của Tomas´: Tôi thực sự không muốn x
là toàn cầu hoặc để thoát khỏi phạm vi. Nhưng tôi muốn tương đương với
let rec h n z = if n = 0 then z
else (fun x -> (h (n - 1) (x + z))) n
với trích dẫn. Câu trả lời của bạn cung cấp cho (h 3 <@ 1 @>).Eval() = 4
nơi sản lượng trên h 3 1 = 7
. Và ở đây, tôi muốn 7
là câu trả lời.
Tôi không biết MeyaOCaml, nhưng có vẻ như bạn đang cố gắng sử dụng biến từ báo giá lambda trong mã F # thực. Báo giá không thực sự là mã F #, và vì lý do đó bạn cũng không thể đánh giá chúng (ngoại trừ với bộ đánh giá LINQ, không hoàn hảo). –