Tất cả chúng ta đều biết (hoặc nên biết) rằng Haskell lười biếng theo mặc định. Không có gì được đánh giá cho đến khi nó phải được đánh giá. Vì vậy, khi một cái gì đó phải được đánh giá? Có những điểm mà Haskell phải nghiêm khắc. Tôi gọi đây là "điểm nghiêm ngặt", mặc dù thuật ngữ cụ thể này không phổ biến như tôi đã nghĩ. Theo tôi:
Giảm (hoặc đánh giá) trong Haskell chỉ xảy ra ở các điểm nghiêm ngặt.
Vì vậy, câu hỏi là: những gì, chính xác , là những điểm nghiêm Haskell không? Trực giác của tôi nói rằng main
, seq
/ mô hình tiếng nổ, khớp mô hình và bất kỳ IO
hành động nào được thực hiện thông qua main
là những điểm nghiêm ngặt chính, nhưng tôi thực sự không biết tại sao tôi biết điều đó.
(Ngoài ra, nếu chúng không được gọi là "điểm nghiêm ngặt" thì chúng được gọi là gì?)
Tôi tưởng tượng một câu trả lời tốt sẽ bao gồm một số cuộc thảo luận về WHNF, v.v. Tôi cũng tưởng tượng nó có thể chạm vào giải tích lambda.
Chỉnh sửa: suy nghĩ bổ sung về câu hỏi này.
Như tôi đã suy nghĩ về câu hỏi này, tôi nghĩ rằng sẽ rõ ràng hơn nếu thêm điều gì đó vào định nghĩa về điểm nghiêm ngặt. Các điểm nghiêm ngặt có thể có nhiều bối cảnh khác nhau và độ sâu (hoặc độ nghiêm ngặt) khác nhau . Quay trở lại định nghĩa của tôi rằng "giảm Haskell chỉ xảy ra ở các điểm nghiêm ngặt", chúng ta hãy thêm vào định nghĩa đó điều khoản này: "điểm nghiêm ngặt chỉ được kích hoạt khi bối cảnh xung quanh của nó được đánh giá hoặc giảm."
Vì vậy, hãy để tôi cố gắng giúp bạn bắt đầu với loại câu trả lời mà tôi muốn. main
là một điểm nghiêm ngặt. Nó được chỉ định đặc biệt là điểm nghiêm ngặt chính của bối cảnh: chương trình. Khi chương trình ( main
của ngữ cảnh) được đánh giá, điểm nghiêm ngặt của main được kích hoạt. Độ sâu của Main là tối đa: nó phải được đánh giá đầy đủ. Chính thường bao gồm các hành động IO, cũng là các điểm nghiêm ngặt, có ngữ cảnh main
.
Bây giờ bạn thử: thảo luận seq
và so khớp mẫu trong các thuật ngữ này. Giải thích các sắc thái của ứng dụng chức năng: nó nghiêm ngặt như thế nào? Làm thế nào là nó không? Về deepseq
thì sao? let
và các case
câu lệnh? unsafePerformIO
? Debug.Trace
? Định nghĩa cấp cao nhất? Các kiểu dữ liệu nghiêm ngặt? Bang mẫu? Vv. Có bao nhiêu trong số những mặt hàng này có thể được mô tả chỉ bằng cách đối sánh seq hoặc mẫu?
seq
và khớp mẫu là đủ, với phần còn lại được xác định theo các điều kiện đó. Tôi nghĩ rằng đối sánh mẫu đảm bảo tính nghiêm ngặt của cácIO
hành động chẳng hạn.