{-# 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?
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