Tôi nhận được rằng seqđược sử dụng để cải thiện hiệu suất bằng cách tránh sự lười biếng không cần thiết. Tôi chỉ muốn biết tên bắt nguồn từ đâu? Là từ "trình tự" hay "tuần tự"? Và làm thế nào để tên liên quan đến đánh giá nghiêm ngặt?
Tôi nhận được rằng seqđược sử dụng để cải thiện hiệu suất bằng cách tránh sự lười biếng không cần thiết. Tôi chỉ muốn biết tên bắt nguồn từ đâu? Là từ "trình tự" hay "tuần tự"? Và làm thế nào để tên liên quan đến đánh giá nghiêm ngặt?
Câu trả lời:
Nó đến từ điểm thứ tự . Đó là một khái niệm nổi tiếng trong C, và nó thực sự khá giống với seqtoán tử trong Haskell: mọi tính toán ở bên trái nên được thực hiện trước bất kỳ tính toán nào ở bên phải .
Tất nhiên, Haskell seqít đòi hỏi hơn thế: nó chỉ yêu cầu rằng thứ bên trái được đánh giá ở dạng đầu yếu thông thường trước khi kết quả bên phải được đánh giá. Và nó không thực sự đảm bảo bất kỳ thứ tự đánh giá đặc biệt tại tất cả † , chỉ rằng nếu biểu thức bên trái là ⊥ thì một bên phải không được đánh giá.
Xem pseqhoặc deepseqđể biết các lựa chọn thay thế mạnh hơn, gần hơn với những gì C gọi là điểm chuỗi.
† Trên thực tế, điểm chuỗi C hoặc C ++ không đảm bảo trật tự tính toán hoặc, duy nhất mà bất kỳ tác dụng phụ là theo thứ tự đúng. Tuy nhiên, trong các tác dụng phụ của C có mặt ở khắp mọi nơi nên ngoài việc tối ưu hóa ở mức độ thấp, bạn thường có thể cho rằng thứ tự điểm chuỗi sẽ được duy trì, trong khi thực tế GHC sẽ thường xuyên vứt seqđi nếu chỉ biết rằng các biểu thức không phân kỳ.
alà ⊥ thì a `seq` bkhông được trả lại kết quả của b.
bnếu có ⊥. Tôi nghĩ rằng việc bạn đảm bảo bsẽ không bị "đánh giá" (hoặc nhìn vào) theo bất kỳ ý nghĩa nào là sai lệch và thậm chí thực tế là sai (và tôi nghĩ đó là sự khác biệt trung tâm với pseq). Tôi nghĩ rằng "buộc kết quả của seq a bcác lực nhất thiết a, và seq a b = bkhi nào a != ⊥" là chính xác hơn.
bnếu đó là phạm lỗi ⊥- đó sẽ là điều ít nhất có ý nghĩa để nói, trong Haskell mà không đề cập đến bất kỳ triển khai nào. Chỉ, bạn có thể không thực sự làm được điều này, nói chung - bởi vì nó sẽ đòi hỏi đầu tiên minh rằng blà ⊥, và cho rằng bạn cần phải giải quyết vấn đề ngăn chặn tha.
seq a b = bkhi nào a != ⊥", và sau đó để mô tả cách nó thực sự có xu hướng hoạt động trong GHC, tôi sẽ nói "buộc kết quả của seq a bcác lực nhất thiết a".
seq a bsẽ là: "đánh giáb, sauađó trả lạib".