2016-02-16 13 views
5
{-# LANGUAGE PatternSynonyms, ViewPatterns #-} 

data Quun = Foo | Bar | Oink Quun 

fooey :: Quun -> Bool 
fooey Foo = True 
fooey (Oink Yum) = True 
fooey _ = False 

pattern Yum <- (fooey -> True) 

này không biên dịch (ít nhất là trong GHC-7.10.2)Tại sao tất cả các từ đồng nghĩa mẫu đệ quy bị từ chối?

/tmp/wtmpf-file10227.hs:1:1: 
    Recursive pattern synonym definition with following bindings: 
     foo (defined at /tmp/wtmpf-file10227.hs:(6,1)-(8,13)) 
     Yum (defined at /tmp/wtmpf-file10227.hs:10:1-28) 

Chắc chắn, các mẫu trực tiếp tự giới thiệu đơn giản này sẽ có ý nghĩa. Nhưng có một số lý do cơ bản tại sao ngay cả bố cục trung gian dạng xem như trên không thể? Tôi không thể tìm thấy điều này thuyết phục; sau tất cả những gì có thể để nội tuyến mô hình điểm và có được một hoàn toàn vô hại (cũng ... ít nhất, phép) định nghĩa:

fooey :: Quun -> Bool 
fooey Foo = True 
fooey (Oink (fooey -> True)) = True 
fooey _ = False 

pattern Yum <- (fooey -> True) 

Vì vậy, là từ đồng nghĩa như vậy chỉ là không có sẵn nào cho lý do kỹ thuật, và sẽ chúng ta có được chúng trong tương lai?

+0

Tác giả của 'PatternSynonyms' tại đây: đây là một điểm tốt và đáng để mở một vé. Tuy nhiên, điều này có thể không dễ thực hiện, bởi vì, nếu tôi nhớ đúng, GHC không tiết lộ nhiều thông tin về "tại sao" một cái gì đó kết thúc trong tập các biến miễn phí. – Cactus

Trả lời

5

Một số mẫu đệ quy là có vấn đề, như

f :: [()] -> Bool 
f L = True 
f _ = False 

pattern L <-() : L 

được này phải gì để desugar tới?

Mẫu không phải là giá trị hạng nhất. Chúng chỉ được thay thế bằng các định nghĩa của chúng khi chúng xuất hiện. Đối với một ngôn ngữ như vậy, các định nghĩa đệ quy nói chung không hợp lý.

+2

Vâng, tôi đã không đề nghị rằng các từ đồng nghĩa mẫu hai chiều đơn giản nên được phép đệ quy. Chỉ với các dạng xem có thể có ý nghĩa này; nhưng sau đó nó có thể cho phép một số ứng dụng tốt đẹp thực sự. – leftaroundabout

+2

Vâng 'L' là một từ đồng nghĩa mẫu đệ quy và cần phải bị từ chối, vì vậy nó khớp với tiêu đề của câu hỏi của bạn. Tôi đồng ý rằng khi đệ quy đi qua một chức năng, nó có thể ổn. –

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