Sự hiểu biết hiện tại của tôi về chồng chéo mẫu trong Haskell là 2 mẫu được coi là chồng chéo nếu một số giá trị đối số được truyền cho hàm có thể được khớp với nhiều mẫu.Ý nghĩa của mẫu chồng lên nhau trong Haskell
Given:
last :: [a] -> a
last [x] = x
last (_ : xs) = last xs
đi qua các giá trị tham số [1] sẽ phù hợp với cả hai mô hình đầu tiên [x] và mô hình thứ 2 (_: xs) - do đó sẽ có nghĩa là chức năng đã chồng chéo mẫu mặc dù cả hai mẫu có thể được khớp.
Điều làm cho điều này gây nhầm lẫn là mặc dù các mẫu (theo định nghĩa trên) chồng lên nhau, GHC không hiển thị bất kỳ cảnh báo nào về việc chúng trùng lặp.
Lùi lại mô hình 2 trận đấu trong last
chức năng không hiển thị các cảnh báo chồng chéo:
last :: [a] -> a
last (_ : xs) = last xs
last [x] = x
Cảnh báo:
src\OverlappingPatterns.hs:6:1: Warning:
Pattern match(es) are overlapped
In an equation for `last': last [x] = ...
Nó gần như GHC consideres các mô hình chồng chéo nếu một mô hình trước đó làm cho nó không thể phù hợp với một mô hình xảy ra sau đó.
Cách chính xác để xác định xem một hàm có mẫu chồng chéo hay không?
Cập nhật
Tôi đang tìm kiếm các nghĩa được sử dụng trong fp101x nhiên.
Theo định nghĩa được sử dụng trong fp101x chức năng sau có overlapping patterns
:
last :: [a] -> a
last [x] = x
last (_ : xs) = last xs
Đây là mâu thuẫn với định nghĩa của GHC mà không xem xét nó có bất kỳ mô hình chồng chéo.
Không có định nghĩa đúng về những gì có nghĩa là trong ngữ cảnh khóa học fp101x, không thể giải quyết bài tập đó. Và định nghĩa được sử dụng không phải là định nghĩa của GHC.
GHC cảnh báo về "chồng chéo mẫu" khi thực sự phát hiện "bao gồm mẫu" - chính xác khi một trường hợp trong mẫu trở nên không thể truy cập được vì nó chỉ bao gồm các giá trị đã được xử lý trong các trường hợp trước đó. – chi
@chi: đó sẽ là những gì GHC coi là "chồng chéo mẫu". Định nghĩa hàm đầu tiên có vẻ được xem là 'chồng chéo mẫu'. Có một định nghĩa chính thức về 'chồng chéo mẫu' là gì không? –
Từ mô tả của bạn, có vẻ như họ không muốn bất kỳ loại chồng chéo nào. Sau đó, bạn có thể làm điều gì đó giống như sử dụng mẫu 'last _: x: xs = last (x: xs); cuối cùng [x] = x' hoặc sử dụng bảo vệ. –