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)?
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)?
Câu trả lời:
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 strict
trong một thời gian ngắn.
Nó được gọi seq
bởi vì nó được gọi seq
bằ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
seq
và 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 seq
bả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, seq
là 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.
Bây giờ, tại sao điều đó không được gọi đơn giản strict
trong 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 đó, sequence
khô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 Eval
typeclass :
seq :: Eval a => a -> b -> b
strict :: Eval a => (a -> b) -> (a -> b)
strict f = \x -> seq x (f x)
Cả hai Eval
cũng strict
khô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 ($!)
.
seq
và 1.3 có .ps
bả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ũ.