tôi có chức năng này trong Haskell:Tại sao các nhân viên bảo vệ không đầy đủ gây ra sự phù hợp với mô hình không thể chối cãi để thất bại?
test :: (Eq a) => a -> a -> Maybe a
test a b
| a == b = Just a
test _ _ = Nothing
Đây là những gì tôi nhận được khi tôi đã thử các chức năng với các đầu vào khác nhau:
ghci>test 3 4
Nothing
ghci>test 3 3
Just 3
Theo Real World Haskell, mô hình đầu tiên là không thể chối cãi. Nhưng có vẻ như test 3 4
không làm hỏng mẫu đầu tiên và khớp với mẫu thứ hai. Tôi mong đợi một số loại lỗi - có thể là 'những người bảo vệ không đầy đủ'. Vì vậy, những gì đang thực sự xảy ra ở đây, và có cách nào để kích hoạt cảnh báo trình biên dịch trong trường hợp điều này vô tình xảy ra?
Vì vậy, nếu đó là một mẫu không thể chối cãi, thì nó sẽ không khớp như thế nào? Có phù hợp phụ thuộc vào sự thành công của các vệ sĩ? Lần đầu tiên nó có khớp, và sau đó không khớp sau khi người bảo vệ không thành công? –
@Matt: Mẫu thực sự khớp với nhau và bất kỳ biến nào bị ràng buộc bởi nó đều được cung cấp cho bảo vệ, điều này có thể không thành công. Khi điều này xảy ra, các lính canh còn lại được thử theo thứ tự. Nếu tất cả đều thất bại, mẫu tiếp theo sẽ được thử. Nếu không có thêm mẫu nào để thử, bạn sẽ gặp phải lỗi đối sánh mẫu không đầy đủ. – hammar
Trong GHC 'nếu không' * là * đặc biệt. Nếu bạn tự mình định nghĩa nó, bạn sẽ kết thúc với các cảnh báo thời gian biên dịch khớp không đầy đủ (miễn là bạn cho phép các cảnh báo đó). – Rotsor