Tôi có một chức năng Erlang nhỏ mà so sánh nếu hai danh sách đều bình đẳng:Pattern khớp trong Haskell và Erlang
myEq([], []) -> true;
myEq([X|Xs], [X|Ys]) -> myEq(Xs, Ys);
myEq(_, _) -> false.
Việc so sánh diễn ra trên dòng 2, X
của [X|Xs]
luôn liên kết với phần tử đầu tiên của danh sách đầu tiên, các đối sánh [X|Ys]
chỉ khi các phần tử đầu tiên của cả hai danh sách đều bằng nhau.
Nếu tôi thử điều này trong Haskell, tôi nhận được thông báo lỗi: "Định nghĩa xung đột cho x
". Một giải pháp khả thi trong Haskell sẽ là:
myEq (x:xs) (y:ys) = if x == y then myEq xs ys else False
Nhưng tôi muốn biết nếu nó có thể làm điều này trong Haskell sử dụng kết hợp mô hình?
Để làm rõ: Erlang cũng không thống nhất. Nếu một biến xảy ra nhiều lần trong một mẫu, trình biên dịch Erlang chỉ tạo ra tên mới cho các lần xuất hiện khác và chèn một kiểm tra bảo vệ yêu cầu chúng bằng nhau, giống như bạn làm thủ công trong Haskell. – RichardC
@RichardC: Tôi đã viết lại câu trả lời cho * thống nhất * và * kiểm tra bình đẳng *. Bạn có nghĩ rằng điều này giải quyết vấn đề này tốt hơn không? –
Vâng, có vẻ tốt hơn. – RichardC