2011-06-28 26 views
6

Tôi hiểu rằng trong:tuple mẫu nổ

f x = x + 1 where !y = undefined

ý nghĩa của mô hình vụ nổ là y là để được đánh giá trước f.

Tương tự:

f x = x + 1 where !(!a, !b) = (undefined, undefined)

ý nghĩa là như nhau, w.r.t xy.

Nhưng điều gì làm các mô hình vụ nổ có nghĩa là trong:

f x = x + 1 where (!a, !b) = (undefined, undefined)

Nó dường như không gây ra không xác định được đánh giá. Khi nào thì các mô hình in-tuple bang có hiệu lực? Nếu tuple của mô hình bị ép buộc? Bất cứ ai có thể đưa ra một ví dụ trong đó (!a, !b) = (..) khác với (a, b) = (..)?

Trả lời

9

Mẫu hình chữ nhật trên bản thân bộ sẽ buộc đánh giá tuple chứ không phải phần tử của nó. Các mẫu Bang trên các phần tử tuple sẽ buộc chúng bất cứ khi nào bản thân tuple được đánh giá.

Dưới đây là ví dụ về hành vi khác:

Prelude> let x = a + 1 where (a, b) = (1, undefined) 
Prelude> x 
2 
Prelude> let x = a + 1 where (!a, !b) = (1, undefined) 
Prelude> x 
*** Exception: Prelude.undefined 
4

Nếu bạn dịch nó để let:

f x = let (!a, !b) = (undefined, undefined) in x + 1 

Ở đây, bạn tạo một tuple chứa (a, b), và khi các tuple được đánh giá, cả hai ab đang có.

Nhưng vì bộ dữ liệu không bao giờ được đánh giá, không phải a cũng không phải b. Điều này về cơ bản giống như viết:

f x = let y = undefined `seq` 4 in x + 1 

Vì y chưa bao giờ được đánh giá, không phải là undefined.