Trước hết, nó có thể hữu ích cần lưu ý rằng không ai trong số những điều bạn đã xác định là một chức năng - eagerFunc
và theValue
là những giá trị của loại int
và lazyFunc
là một giá trị kiểu Lazy<int>
. Với
let lazyTwo = lazy (1 + 1)
và
let eagerTwo = 1 + 1
biểu thức 1 + 1
sẽ không được đánh giá nhiều hơn một lần dù có bao nhiêu lần bạn sử dụng eagerTwo
. Sự khác biệt là 1 + 1
sẽ được đánh giá chính xác một lần khi địnheagerTwo
, nhưng sẽ được đánh giá tại hầu hết các một lần khi lazyTwo
là sử dụng (nó sẽ được đánh giá lần đầu tiên rằng Value
tài sản được truy cập, và sau đó được lưu vào bộ nhớ cache để sử dụng thêm Value
không cần phải tính toán lại nó). Nếu lazyTwo
's Value
không bao giờ được truy cập, thì nội dung của nó 1 + 1
sẽ không bao giờ được đánh giá.
Thông thường, bạn sẽ không thấy nhiều lợi ích khi sử dụng các giá trị lười biếng bằng ngôn ngữ nghiêm ngặt như F #. Họ thêm một lượng nhỏ chi phí từ khi truy cập thuộc tính Value
yêu cầu kiểm tra xem giá trị đã được tính chưa. Họ có thể giúp bạn tiết kiệm một chút tính toán nếu bạn có một cái gì đó như let lazyValue = lazy someVeryExpensiveCalculationThatMightNotBeNeeded()
, vì việc tính toán tốn kém sẽ chỉ diễn ra nếu giá trị thực sự được sử dụng. Họ cũng có thể làm cho một số thuật toán chấm dứt mà nếu không sẽ không, nhưng điều này không phải là một vấn đề lớn trong F #. Ví dụ:
// throws an exception if x = 0.0
let eagerDivision x =
let oneOverX = 1.0/x
if x = 0.0 then
printfn "Tried to divide by zero" // too late, this line is never reached
else
printfn "One over x is: %f" oneOverX
// succeeds even if x = 0.0, since the quotient is lazily evaluated
let lazyDivision x =
let oneOverX = lazy (1.0/x)
if x = 0.0 then
printfn "Tried to divide by zero"
else
printfn "One over x is: %f" oneOverX.Value
Phiên bản F # này là gì? Tôi có một chuỗi hành động uể oải, nhưng không được tạo ra một cách công khai theo cách đó. Tôi đang cố ép nó hoàn thành. – octopusgrabbus