2010-02-11 28 views
9

Tôi khá mới đối với Haskell nhưng có được hầu hết các khái niệm cơ bản. Tuy nhiên có một điều mà tôi không thể hiểu được. Hãy xem xét ví dụ của tôi dưới đây:Tại sao hàm Haskell của tôi không chấp nhận số âm?

example :: Int -> Int 
example (n+1) = ..... 

Phần (n +1) của ví dụ này bằng cách nào đó ngăn đầu vào số âm nhưng tôi không thể hiểu được. Ví dụ .. Nếu đầu vào là (-5) tôi mong đợi n chỉ là (-6) vì (-6 + 1) là (-5). Đầu ra khi thử nghiệm như sau:

Program error: pattern match failure: example (-5)

Bất cứ ai có thể giải thích cho tôi tại sao điều này không chấp nhận số âm?

+8

Lưu ý rằng các mẫu 'n + k' sẽ bị xóa khỏi phiên bản tiếp theo của đặc tả ngôn ngữ Haskell (Haskell 2010). Theo như tôi biết, chúng hiếm khi được sử dụng trong thực tế (mặc dù tôi chắc chắn ai đó sẽ tìm thấy một ví dụ giai thoại). Vì vậy, tôi sẽ đề nghị không sử dụng chúng. –

Trả lời

10

Đó chỉ là cách n+k patterns được định nghĩa để làm việc:

Matching an n+k pattern (where n is a variable and k is a positive integer literal) against a value v succeeds if x >= k, resulting in the binding of n to x - k, and fails otherwise.

Mấu chốt của n + k mẫu là để thực hiện cảm ứng, vì vậy bạn cần phải hoàn thành ví dụ với một trường hợp cơ sở (k-1, hoặc 0 trong trường hợp này), và quyết định xem một thông số nhỏ hơn có phải là lỗi hay không. Như thế này:

example (n+1) = ... 
example 0 = ... 

Ngữ nghĩa rằng bạn đang chủ yếu yêu cầu sẽ là khá vô nghĩa và không cần thiết - bạn chỉ có thể nói

example n = let n' = n-1 in ... 

để đạt được tác dụng tương tự. Điểm của một mô hình là thất bại đôi khi.

+1

Giảng viên của tôi đã sử dụng nó mà không giải thích cách thức hoặc lý do nó hoạt động. Bạn đã giải thích rõ điều đó. Cảm ơn bạn. –

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