Trong chương 6 của "Lập trình trong Haskell" bởi Graham Hutton có một phần gọi là "6,5 đệ quy Mutual", có chứa các ví dụ sau:đệ quy Mutual trong chẵn/lẻ chức năng trong Haskell
even :: Int -> Bool
even 0 = True
even (n + 1) = odd n
odd :: Int -> Bool
odd 0 = False
odd (n + 1) = even n
Tôi muốn thử nó. Tôi đặt mã trong tập tin Hof.hs, chạy ghci (phiên bản 7.8.3), gõ
:l Hof.hs
và nhận được thông báo lỗi sau
Hof.hs:3:7: Parse error in pattern: n + 1 Failed, modules loaded: none.
Tại sao tôi nhận thông báo này? Đoạn mã có lỗi thời hay gì đó không?
Tôi nghĩ điều này thực sự đang xem xét các số tự nhiên và sử dụng 'Int' để thuận tiện. Đưa vào 'abs' có lẽ không có ý nghĩa. Tốt hơn là sử dụng Peano naturals: 'dữ liệu Nat = Zero | Succ Nat', rồi 'ngay cả Zero = Đúng; thậm chí (Succ n) = lẻ n; số lẻ = False; lẻ (Succ n) = thậm chí n'. – dfeuer
@dfeuer Tại sao điều đó không có ý nghĩa? Một số nguyên âm ngay cả khi nó có thể chia hết cho 2 và số lẻ khác. Mặc dù, việc triển khai bạn đưa ra, với sự khớp mẫu của nó, không phù hợp với bản gốc từ câu hỏi gần hơn. –
@DavidYoung, tôi lấy lại. Nếu bạn đang sử dụng một đại diện của các số nguyên như số tự nhiên với một dấu hiệu, sau đó giá trị tuyệt đối là một cách hoàn toàn hợp lý để làm điều đó. Nhưng * none * trong số này có ý nghĩa đối với 'Int', đó là nhị phân bổ sung của 2! – dfeuer