2014-05-09 21 views
9

Tôi không hoàn toàn rõ ràng về cách thức hoạt động của seq trong Haskell.Bạn có bao giờ viết seq x x không?

Nó có vẻ như nó có rất nhiều trường hợp nó sẽ là hữu ích để viết

seq x x 

và thậm chí có thể định nghĩa một hàm:

strict x = seq x x 

nhưng một chức năng như vậy không tồn tại vì vậy tôi đoán cách tiếp cận này là bằng cách nào đó sai lầm. Ai đó có thể cho tôi biết điều này có ý nghĩa hay hữu ích không?

+0

Có bạn đọc [wiki] (http://www.haskell.org/haskellwiki/Seq) trên đó? Nó làm tốt công việc giải thích các sắc thái của 'seq', vì nó không hoàn toàn đơn giản. – bheklilr

+0

“Đặc biệt, biểu thức' 'x' seq' x'' là hoàn toàn thừa, và luôn có tác dụng giống hệt như chỉ viết 'x'” –

+0

Liên quan: [câu trả lời này] (http://stackoverflow.com/ a/19805521/925978) và quan trọng hơn là các nhận xét bên dưới nó. – crockeea

Trả lời

18

seq a b trả về giá trị b, nhưng làm cho giá trị đó tùy thuộc vào đánh giá a. Do đó, seq a a chính xác giống như a.

Tôi nghĩ rằng sự hiểu lầm ở đây là seq không thực hiện bất kỳ hành động nào, bởi vì các hàm thuần túy không thực hiện hành động, nó chỉ giới thiệu một sự phụ thuộc.

Có chức năng evaluate :: a -> IO() trong Control.Exception thực hiện những gì bạn muốn (lưu ý rằng nó ở số IO). Họ đặt nó trong trường hợp ngoại lệ vì nó rất hữu ích để xem nếu đánh giá của một biểu thức sẽ ném, và nếu như vậy xử lý các ngoại lệ.

5

seq x x sẽ hoàn toàn, không cần thiết.

Hãy nhớ rằng, seqkhông phải là lệnh. Sự hiện diện của seq a b trong chương trình của bạn không bắt buộc đánh giá a hoặc b Điều gì làm, là việc đánh giá kết quả giả tạo phụ thuộc vào đánh giá a, mặc dù kết quả là b Nếu bạn in ra seq a b, a sẽ được đánh giá và kết quả của nó bị loại bỏ .. Vì x đã phụ thuộc vào chính nó, seq x x là ngớ ngẩn.

8

Khái niệm x = seq a b nghĩa là nếux được đánh giá, sau đó a cũng sẽ được đánh giá (nhưng x sẽ bằng b).

không có nghĩa là "đánh giá a ngay bây giờ".

Lưu ý rằng nếu x đang được đánh giá, thì kể từ x bằng b, sau đó b cũng sẽ được đánh giá.

Và do đó, nếu tôi viết x = seq a a, tôi nói "nếu x được đánh giá thì hãy đánh giá a". Nhưng nếu tôi chỉ làm x = a, điều đó sẽ đạt được chính xác cùng một điều.

+1

Tôi tin rằng bạn có nghĩa là 'a' cũng sẽ được đánh giá, trong câu 1. –

5

Khi bạn nói seq a b những gì bạn đang nói với máy tính,

Bất cứ khi nào bạn cần đánh giá b, đánh giá a cho tôi quá, xin vui lòng.

Nếu chúng ta thay thế cả ab với x bạn có thể thấy tại sao nó vô dụng để viết seq x x:

Bất cứ khi nào bạn cần đánh giá x, đánh giá x cho tôi quá, xin vui lòng.

Yêu cầu máy tính để đánh giá x khi nó cần phải đánh giá x chỉ là một điều vô ích để làm - nó đang diễn ra để đánh giá x anyway!

seq không không đánh giá bất cứ điều gì - nó chỉ đơn giản nói với máy tính mà khi bạn cần đối số thứ hai, cũng đánh giá đối số đầu tiên. Hiểu điều này thực sự thực sự quan trọng, bởi vì nó cho phép bạn hiểu hành vi của các chương trình của bạn tốt hơn nhiều.

1

Đóng! deepseq (mà là "kỹ lưỡng hơn" seq - xem tài liệu cho một mô tả đầy đủ) có kiểu NFData a => a -> b -> b, và force (với loại NFData a => a -> a) được định nghĩa đơn giản là

force :: (NFData a) => a -> a 
force x = x `deepseq` x 
Các vấn đề liên quan