19

Tôi chỉ tự hỏi liệu có thể khớp với các giá trị giống nhau nhiều lần với cơ sở khớp mẫu của ngôn ngữ lập trình hàm (Haskell/F #/Caml) hay không.Mẫu phù hợp với các giá trị giống hệt nhau

Chỉ cần nghĩ đến ví dụ sau:

plus a a = 2 * a 
plus a b = a + b 

Các biến thể đầu tiên sẽ được gọi khi hàm được gọi với hai giá trị tương tự (mà sẽ được lưu trữ trong a).

Ứng dụng hữu ích hơn sẽ là điều này (đơn giản hóa AST).

simplify (Add a a) = Mult 2 a 

Nhưng Haskell bác bỏ các mã và cảnh báo tôi về định nghĩa mâu thuẫn cho a - Tôi phải làm trường hợp rõ ràng/if-kiểm tra thay vì để tìm hiểu xem chức năng có giá trị giống nhau. Có bất kỳ mẹo nào để chỉ ra rằng một biến tôi muốn đối sánh với sẽ xảy ra nhiều lần không?

+0

FWIW, Mathematica hỗ trợ điều này. –

Trả lời

39

Đây được gọi là mẫu phi tuyến. Đã có một số chủ đề trong danh sách gửi thư của haskell-cafe về điều này, cách đây không lâu. Dưới đây là hai:

http://www.mail-archive.com/[email protected]/msg59617.html

http://www.mail-archive.com/[email protected]/msg62491.html

Bottom line: nó không phải là bất khả thi để thực hiện, nhưng đã quyết định chống lại vì lợi ích của sự đơn giản.

Nhân tiện, bạn không cần if hoặc case để giải quyết vấn đề này; cách (hơi) sạch hơn là sử dụng một người bảo vệ:

a `plus` b 
    | a == b = 2*a 
    | otherwise = a+b 
+0

Cảm ơn các liên kết - Tuyệt vời – Dario

13

Bạn không thể có hai tham số có cùng tên để cho biết rằng họ nên được bình đẳng, nhưng bạn có thể sử dụng guards để phân biệt trường hợp như thế này:

plus a b 
    | a == b = 2 * a 
    | otherwise = a + b 

này là linh hoạt hơn vì nó cũng làm việc cho nhiều điều kiện phức tạp hơn bình đẳng đơn giản.

+0

Có, tôi biết bảo vệ nhưng tôi đã cố tránh mọi so sánh thủ công. – Dario

+0

Cách viết tắt cho điều này: http: // stackoverflow.com/questions/480769/f-matching-with-two-values ​​/ 501541 # 501541 – Dario

-1

Haskell không thống nhất.

+4

Nó sẽ cần các biến miễn phí trên cả hai mặt để thống nhất. –

+1

Đây chỉ là bình đẳng, không thống nhất. Giống như '| a, a khi a = a -> ..'. –

0

Tôi vừa nhìn lên các chủ đề mailing list đưa ra trong câu trả lời của Thomas, và câu trả lời đầu tiên trong một trong số họ làm cho tinh thần tốt, và giải thích lý do tại sao như vậy một "mẫu" sẽ không có ý nghĩa tổng quát nói chung: nếu a là một hàm thì sao? (Nói chung không thể kiểm tra hai chức năng bằng nhau.)

+0

Không thể nó chỉ hạn chế 'a' thành' Eq'? – gdejohn

+0

@gdejohn, tôi nghi ngờ rằng ngữ nghĩa sẽ không đúng. Khi áp dụng định nghĩa biểu mẫu 'fxx = x', người ta có thể mong đợi IMO rằng hai đối số đã gửi là * cùng một giá trị *, và không chỉ" bằng nhau "theo nghĩa của một số kiểu chữ (nếu không nó không rõ ràng của hai giá trị 'x' nên' f' trả lại). – Alexey

-1

Tôi đã triển khai một ngôn ngữ lập trình chức năng mới có thể xử lý các mẫu phi tuyến tính trong Haskell.

https://github.com/egison/egison

Trong ngôn ngữ của tôi, chức năng của bạn plus bằng văn bản như sau.

(define $plus 
    (match-lambda [integer integer] 
    {[[$a ,a] (* a 2)] 
    [[$a $b] (+ a b)]})) 
Các vấn đề liên quan