Tại sao chức năng giới thiệu nghiêm ngặt được gọi là seq?


8

Tôi hiểu chức năng seq và tại sao cần phải giới thiệu tính nghiêm ngặt để đạt hiệu quả. Điều tôi không hiểu là, tại sao cái nguyên thủy này được gọi là seq(và không phải là thứ gì đó để làm với sự nghiêm ngặt)?


4
Tôi đoán nó xuất phát từ "trình tự" như trong "đánh giá điều này trước khi đánh giá điều đó". Nếu đây là nguồn gốc, thì đó là một tên rất dễ gây hiểu lầm, vì nó không đảm bảo rằng đối số đầu tiên được đánh giá trước đối số kia.
chi

Câu trả lời:


8

TL; DR: Miranda gọi nó seq, nó được giới thiệu khi sequence(có lẽ) đã là một thứ dành cho Monads, và ($!)được biết đến stricttrong một thời gian ngắn.

Miranda là người đầu tiên

Nó được gọi seqbởi vì nó được gọi seqbằng Miranda và các ngôn ngữ trước đó, ít nhất là theo A History of Haskell: Lazy Lazy Class của Paul Hudak, John Hughes, Simon Peyton Jones và Philip Wadler .

Cả hai seqvà các thành phần nghiêm ngặt của cấu trúc dữ liệu đã có mặt ở Miranda vì những lý do tương tự (Turner, 1985), và thực sự seqđã được sử dụng để khắc phục rò rỉ không gian trong các chương trình lười biếng từ đầu những năm 1980 (Scheevel, 1984; Hughes, 1983)

Lưu ý rằng Turner chỉ giới thiệu các thành phần nghiêm ngặt trong bài báo năm 1985 , chứ không phải seqbản thân nó và "Hướng dẫn sử dụng NORMA Sasl" của Scheevel dường như bị mất hoặc ít nhất là không có sẵn trên Internet. Luận án Hughes ("Hughes, 1983" ở trên) cũng không giới thiệu seq.

Dù bằng cách nào, seqlà một phần của môi trường tiêu chuẩn Mirandas và cũng chứa một gợi ý tại sao nó được gọi là seq:

`seq 'được áp dụng cho hai giá trị, trả về giá trị thứ hai nhưng kiểm tra xem giá trị đầu tiên không hoàn toàn không được xác định. Đôi khi cần thiết, ví dụ để đảm bảo đồng bộ hóa chính xác trong các chương trình tương tác.

Đồng bộ hóa chính xác hoặc seq uences.

Tên khác có thể

Bây giờ, tại sao điều đó không được gọi đơn giản stricttrong Haskell? Hay thậm chí sequence?

Chà, hóa ra Haskell 1.3 , được giới thiệu seq, cũng đã giới thiệu Monad, và do đó sequence :: Monad m => [m a] -> m (). Do đó, sequencekhông có sẵn như là một tên.

Bây giờ sequenceđã ra khỏi hình ảnh, chúng ta hãy xem xét strict. strictđã được đưa vào 1.3, từ 1.3 giới thiệu một Evaltypeclass :

seq :: Eval a => a -> b -> b
strict :: Eval a => (a -> b) -> (a -> b)
strict f = \x -> seq x (f x)

Cả hai Evalcũng strictkhông thực hiện việc cắt thành Haskell98. Thay vào đó, Evalđã bị loại bỏ hoàn toàn, vì nó được áp dụng cho tất cả các loại, và strictđược đổi tên thành ($!).


1
Lưu ý: Tôi viết lại câu trả lời này nhiều lần từ đầu mỗi khi tôi bắt gặp một nguồn mới làm sáng tỏ hơn một chút về chủ đề này. Cũng lưu ý rằng bạn sẽ mất đi sự tỉnh táo nếu bạn cố chạy các phiên bản Haskell 1.0 và 1.1 cũ thông qua môi trường LaTeX hiện đại. May mắn thay, không có bản 1.0, 1.1 hay 1.2 nào được bao gồm seqvà 1.3 có .psbản phát hành HTML và phù hợp . Nếu bạn muốn xem tại sao I / O đơn điệu được tổ chức thì hãy tìm [Request] -> [Response]mô hình IO dựa trên cũ . Lười biếng với lớp học có lẽ là nguồn lực tốt nhất để nhìn xa hơn, ngoài những phút gặp gỡ cũ.
Zeta
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.