Tôi đang viết một hàm để đơn giản hóa biểu thức Boolean. Ví dụ: Nand(A, A) == Not(A)
. Tôi đã cố gắng thực hiện quy tắc đặc biệt này sử dụng kết hợp mô hình, như vậy:Ngụ ý bình đẳng trong kết hợp mẫu Haskell
-- Operands equivalent - simplify!
simplify (Nand q q) = Not (simplify q)
-- Operands must be different, so recurse.
simplify (Nand q q') = Nand (simplify q) (simplify q')
Khi biên soạn, tôi nhận được lỗi:
Conflicting definitions for `q'
Bound at: boolean.hs:73:21
boolean:73:29
In an equation for `simplify'
Tôi nghĩ rằng tôi hiểu những gì đang xảy ra, và tôi đã đã làm việc xung quanh nó, nhưng tôi chỉ muốn biết:
- Tại sao loại kết hợp mẫu này lại không thể?
- Có cách giải quyết thành ngữ không?
Tiết lộ đầy đủ: điều này liên quan đến bài tập ở nhà, nhưng mục đích của khóa học không phải là để tìm hiểu Haskell và tôi đã tự giải quyết theo cách riêng của mình.
Điệp khúc ấy sử dụng một biến hai lần được gọi là một tổ chức phi mô hình tuyến tính. Có những ngôn ngữ cung cấp các mẫu phi tuyến tính như Erlang và tôi nghĩ đó là một lựa chọn thiết kế để không bao gồm chúng trong Haskell. Bài đăng danh sách gửi thư http://www.mail-archive.com/[email protected]/msg03721.html chứa một số đối số chống lại các mẫu phi tuyến tính nhưng chúng là các đối số cấp cao. –
Lưu ý rằng (Nand q q ') không ngụ ý rằng q và q' khác nhau. q = 3 q '= 3 (Tôi nghĩ đây là lý do cho việc thiết kế) –
@Vixen, tốt, nếu mẫu đầu tiên không khớp, nó có nghĩa là chúng khác nhau trong mẫu thứ hai ... – dflemstr