2013-06-07 23 views
18

Trình biên dịch Haskell ném một lỗi trên các chức năng sau:Haskell Pattern Matching Thất bại trên Số Negative

balancedMax :: Int -> Int -> Int 
balancedMax -1 _ = -1 
balancedMax _ -1 = -1 
balancedMax a b = max a b 

Flipping dấu giải quyết vấn đề:

balancedMax :: Int -> Int -> Int 
balancedMax 1 _ = -1 
balancedMax _ 1 = -1 
balancedMax a b = max a b 

Tại sao mô hình kết hợp thất bại trên phim âm bản và giải pháp dọn dẹp sạch sẽ là gì?

Trả lời

30

Không thành công vì nó cho rằng bạn đang cố gắng xác định lại toán tử trừ, vì f -1 = ... được phân tích cú pháp là f - 1 = ....

Để khắc phục điều này, bạn chỉ cần thêm dấu ngoặc đơn:

balancedMax :: Int -> Int -> Int 
balancedMax (-1) _ = -1 
balancedMax _ (-1) = -1 
balancedMax a b = max a b 

Điều tương tự cũng xảy ra trong các biểu thức. Để gọi số balancedMax với chữ cái âm, bạn cũng sẽ cần dấu ngoặc đơn.

6

f -1 = ... được phân tích cú pháp như f - 1 = ....

nào nếu bạn không biết, có nghĩa là điều tương tự như:

(-) f 1 = .... 

đó cũng tương tự như việc xác định một chức năng như thế này:

somefunc x 1 = x + 1 

Điều gì xảy ra tương đương với xác định somefunc() như thế này:

x `somefunc` 1 = x + 1 

Chỉ là với (-), bạn không cần phải viết backticks khi sử dụng nó trong ghi vào vị trí, ví dụ: đặt giữa hai đối số của nó.

Hai cuốn sách bắt đầu bằng haskell mà tôi đã xem xét cả hai đều cảnh báo bạn sớm về sự thống nhất - cần được sử dụng với dấu ngoặc đơn, ví dụ: (-3).

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