Đó là tuyên bố nghiêm ngặt. Về cơ bản, nó có nghĩa là nó phải được đánh giá với cái gọi là "dạng đầu bình thường yếu" khi giá trị cấu trúc dữ liệu được tạo ra. Hãy xem xét một ví dụ, để chúng ta có thể thấy chỉ là những gì này có nghĩa là:
data Foo = Foo Int Int !Int !(Maybe Int)
f = Foo (2+2) (3+3) (4+4) (Just (5+5))
Chức năng f
trên, khi đánh giá, sẽ trả về một "thunk": đó là, mã để thực hiện để tìm ra giá trị của nó . Tại thời điểm đó, một Foo thậm chí không tồn tại, chỉ là mã.
Nhưng tại một số điểm ai đó có thể cố gắng để nhìn vào bên trong nó, có lẽ thông qua một mô hình phù hợp:
case f of
Foo 0 _ _ _ -> "first arg is zero"
_ -> "first arge is something else"
Điều này sẽ thực hiện đủ code để làm những gì nó cần, và không còn nữa. Vì vậy, nó sẽ tạo ra một Foo với bốn tham số (vì bạn không thể nhìn vào bên trong nó mà không có nó). Đầu tiên, vì chúng tôi đang thử nghiệm nó, chúng tôi cần phải đánh giá tất cả các cách để 4
, nơi chúng tôi nhận ra nó không phù hợp.
Thứ hai không cần phải được đánh giá, bởi vì chúng tôi không thử nghiệm nó. Do đó, thay vì 6
được lưu trữ ở vị trí bộ nhớ đó, chúng tôi sẽ chỉ lưu trữ mã để có thể đánh giá sau này, (3+3)
. Điều đó sẽ biến thành 6 chỉ khi ai đó nhìn vào nó.
Thông số thứ ba, tuy nhiên, có !
ở phía trước, vì vậy được đánh giá đúng: (4+4)
được thực hiện và 8
được lưu trữ ở vị trí bộ nhớ đó.
Thông số thứ tư cũng được đánh giá đúng. Nhưng đây là nơi nó hơi phức tạp một chút: chúng tôi đang đánh giá không hoàn toàn, nhưng chỉ cho hình dạng đầu bình thường yếu. Điều này có nghĩa là chúng tôi tìm hiểu xem đó là Nothing
hoặc Just
điều gì đó và lưu trữ điều đó, nhưng chúng tôi không tiến xa hơn nữa. Điều đó có nghĩa là chúng tôi lưu trữ không Just 10
nhưng thực tế là Just (5+5)
, để lại phần bên trong không được đánh giá. Điều này là quan trọng để biết, mặc dù tôi nghĩ rằng tất cả các tác động của điều này đi chứ không phải là phạm vi của câu hỏi này.
Bạn có thể chú thích đối số chức năng trong cùng một cách, nếu bạn kích hoạt phần mở rộng BangPatterns
ngôn ngữ:
f x !y = x*y
f (1+1) (2+2)
sẽ trả lại thunk (1+1)*4
.
Tôi nghi ngờ rằng đây có thể là một câu hỏi rất phổ biến; Tôi nhớ rõ ràng đang tự hỏi về chính xác những điều tương tự như bản thân mình, cách trở lại khi nào. –