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 seq
toá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 pseq
hoặ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ỳ.
a
là ⊥ thì a `seq` b
không được trả lại kết quả của b
.
b
nếu có ⊥
. Tôi nghĩ rằng việc bạn đảm bảo b
sẽ 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 b
các lực nhất thiết a
, và seq a b = b
khi nào a != ⊥
" là chính xác hơn.
b
nế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
là ⊥
, và cho rằng bạn cần phải giải quyết vấn đề ngăn chặn tha.
seq a b = b
khi 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 b
các lực nhất thiết a
".
seq a b
sẽ là: "đánh giáb
, saua
đó trả lạib
".