2012-07-30 34 views
5

thể trùng lặp:
Why don't Haskell list comprehensions cause an error when pattern match fails?mẫu không đầy đủ trong Haskell danh sách hiểu

Hôm nay tôi thấy đoạn mã sau:

Prelude> [a | Just a <- [Just 10, Nothing, Just 20]] 
[10, 20] 

Nó hoạt động. Nhưng tôi nghĩ rằng danh sách hiểu trên là đường chỉ là cú pháp cho ...

[Just 10, Nothing, Just 20] >>= (\(Just x) -> return x) 

... mà Haskell, khi gặp phải những Nothing, sẽ phát ra một lỗi *** Exception: Non-exhaustive patterns in lambda.

Vì vậy, câu hỏi của tôi là: những gì hiện [a | Just a <- [Just 10, Nothing, Just 20]] dịch thành (về mã monadic) mà làm cho nó bỏ qua các Nothing?

+0

@ephemient: Cảm ơn! Bài đăng bạn đã liên kết để trả lời câu hỏi của tôi. Và tôi đã tìm thấy [một] (http://stackoverflow.com/questions/7007222/haskell-list-comprehension-to-combinatory). Lý do tôi không tìm thấy những bài viết này trước khi tôi đăng câu hỏi của tôi là vì họ không chứa từ "đầy đủ", đó là thuật ngữ của Haskell cho vấn đề. (Tôi mới sử dụng StackOverflow và không chắc chắn mình nên làm gì. Tôi có nên xóa câu hỏi này không? Nó vẫn hữu ích cho những người gõ "[không] đầy đủ".) –

+0

Bạn không cần phải xóa - cuối cùng nó sẽ được đóng lại như là một bản sao, có nghĩa là sẽ có một liên kết lớn lên đầu người chuyển tiếp từ đây đến tiếp theo với câu trả lời. Và, như bạn lưu ý, nó hữu ích hơn để giữ xung quanh hơn để giết :) – ephemient

Trả lời

2

Tôi nghĩ câu trả lời hay nhất trong số that other question thực sự là thuật ngữ tham chiếu 'ma thuật biên dịch'. Bạn phù hợp với mô hình Just x, và theo Haskell 2010 Report hành vi được quy định như

.. nếu một trận đấu thất bại thì đó yếu tố của danh sách chỉ đơn giản là bỏ qua.

Vì vậy, tôi nghĩ rằng việc triển khai hoàn toàn miễn phí khi thực hiện điều này (ví dụ: desugaring không nhất thiết phải là duy nhất).

Các vấn đề liên quan