Hàm Haskell `seq` lấy tên từ đâu?


8

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:


9

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ỳ.


4
Tôi không nghĩ rằng "nếu biểu thức bên trái là thì không phải đánh giá biểu thức bên phải." Ví dụ, xem wiki.haskell.org/Seq , nơi nó nói rằng việc triển khai hợp pháp seq a bsẽ là: "đánh giá b, sau ađó trả lại b".
oonomk

@oisdk tốt, thật sự không có ý nghĩa gì khi nói về đánh giá cả - đây thậm chí không phải là một khái niệm xác định. Vấn đề là, nếu alà ⊥ thì a `seq` bkhông được trả lại kết quả của b.
rẽ trái

Bằng cách "đánh giá", ý tôi là "lực yếu ở dạng bình thường". Ngoài ra, tôi vẫn nghĩ rằng lời giải thích của bạn không đúng: bạn có thể trả lại kết quả 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.
oonomk

@oisdk, nhưng bắt buộc, không phải bất cứ điều gì Haskell biết. - Vâng, về mặt lý thuyết, bạn có thể cung cấp lại kết quả 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 b, và cho rằng bạn cần phải giải quyết vấn đề ngăn chặn tha.
rẽ trái

1
Chắc chắn, "buộc" không phải là một thuật ngữ bạn có thể sử dụng để mô tả ngữ nghĩa, nhưng cũng không phải là "đánh giá" và tôi đang cố gắng đưa ra một giải pháp thay thế cho hai cách giải thích mà bạn đưa ra: "điều bên trái được đánh giá là đầu yếu ở dạng bình thường trước khi kết quả bên phải được đánh giá "," nếu biểu thức bên trái là ⊥ thì không được đánh giá bên phải ", cả hai đều cho rằng sai. Để giải thích chính xác, tôi sẽ nói " 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".
oonomk
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.