2015-02-10 13 views
10

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?

Trả lời

17

n + k patterns have been removed từ Haskell và không còn khả dụng nữa. Viết nó như thay vì điều này:

even :: Int -> Bool 
even 0 = True 
even n = odd (n - 1) 

odd :: Int -> Bool 
odd 0 = False 
odd n = even (n - 1) 

Lưu ý rằng chức năng này không khủng khiếp cho các đầu vào tiêu cực, vì vậy bạn có thể muốn tăng thêm nó với abs.

+2

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

+0

@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. –

+0

@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

Các vấn đề liên quan