Tôi không nghĩ rằng điều này có thể xảy ra trong Haskell.
Tuy nhiên, trong trường hợp của bạn, mẫu có hiệu quả chỉ là một chức năng thuộc loại a -> Bool
. Vì vậy, thay vì chấp nhận mẫu, hãy chấp nhận bất kỳ chức năng nào từ a
đến Bool
. Ví dụ của bạn tương đương với việc áp dụng hàm a -> Bool
trên a
.
Bây giờ, nếu bạn muốn làm điều gì đó tổng quát hơn, giống như việc có thể sử dụng các biểu tượng phù hợp từ mẫu trong phần fun1
, bạn sẽ không thể thực hiện nó bằng chức năng. Tuy nhiên, tôi nghi ngờ điều này là có thể với Haskell ở tất cả - nó sẽ yêu cầu phần mở rộng lạ cho hệ thống loại để làm cho bất kỳ ý nghĩa. So khớp mẫu trong Haskell không phải là một công dân hạng nhất, vì vậy bạn không thể thực sự vượt qua các mẫu xung quanh như vậy.
Nếu bạn muốn loại hành vi này, hãy xem sách Pattern Calculus nơi tác giả phát triển và chính thức hóa một ngôn ngữ có nhiều tính năng khớp mẫu tổng quát hơn Haskell. Nó làm cho các mẫu trở thành một công dân hạng nhất, không giống như Haskell. Tôi chưa thực sự hoàn thành cuốn sách này, nhưng tôi khá chắc chắn rằng mã như vậy là chính xác những gì bạn sẽ có thể viết, trong số những thứ khác.
Tác giả đã xây dựng ngôn ngữ xung quanh ý tưởng của mình về kết hợp mẫu được gọi là bondi; nó có lẽ cũng đáng để kiểm tra, đặc biệt là nếu bạn không muốn bận tâm với cuốn sách. Tôi không biết nếu nó đã sẵn sàng để sử dụng thực tế, nhưng nó chắc chắn thú vị.
Nguồn
2012-07-05 01:20:34
tôi không nói F #, nhưng tôi nghĩ [mô hình hoạt động] (http: // msdn.microsoft.com/en-us/library/dd233248.aspx) có thể làm điều tương tự. – phg