2011-02-06 44 views
20

Tôi đã làm 99 Problems in Haskell khi tôi gặp phải một số solution đến Problem 19 mà tôi không hiểu đầy đủ.Haskell (n + 1) trong mẫu phù hợp với

Nhiệm vụ là viết một hàm xoay hoạt động như

*Main> rotate ['a','b','c','d','e','f','g','h'] 3 
"defghabc" 

*Main> rotate ['a','b','c','d','e','f','g','h'] (-2) 
"ghabcdef" 

Một giải pháp được cung cấp này là

rotate [] _ = [] 
rotate l 0 = l 
rotate (x:xs) (n+1) = rotate (xs ++ [x]) n 
rotate l n = rotate l (length l + n) 

Tôi không hiểu làm thế nào phù hợp với mô hình bao giờ có thể đạt được dòng thứ tư. Nó dường như phải làm với các (n+1) để khi n là tiêu cực dòng thứ ba không phù hợp và do đó thứ tư được thực hiện. Nếu đó là trường hợp tại sao ký hiệu (n+1) hoạt động theo cách đó. không phải là tùy ý hay là một quy ước (trong toán học?) mà tôi không biết?

Bởi vì cách tôi hiểu nó là xoay được gọi là đệ quy trong dòng thứ ba với đối số n giảm một. Vì vậy, tôi sẽ nghĩ rằng

rotate [] _ = [] 
rotate l 0 = l 
rotate (x:xs) n = rotate (xs ++ [x]) (n-1) 
rotate l n = rotate l (length l + n) 

tương đương. Tuy nhiên, nó không phải là. Định nghĩa này đưa ra cảnh báo sau đây

Warning: Pattern match(es) are overlapped 
     In the definition of `rotate': rotate l n = ... 

trong khi định nghĩa trước đây chỉ biên dịch tốt.

Trả lời

26

Đó là trường hợp cụ thể của những gì được gọi là "mẫu n + k", thường không được yêu thích và will be has been removed from the language. Xem here để biết thêm thông tin.

Here là một lưu ý tốt về n + k mô hình, trong đó trích dẫn sau đây từ Báo cáo Haskell 98 (tôi nhấn mạnh):

Matching một n + k mẫu (trong đó n là một biến và k là số nguyên dương chữ) so với giá trị v thành công nếu x> = k, dẫn đến kết buộc của n thành x - k và không thành công. Một lần nữa, các chức năng> = và - bị quá tải, tùy thuộc vào loại mẫu. Trận đấu sẽ phân biệt nếu so sánh các phân tách .

Cách diễn giải chữ k là giống như trong các mẫu số bằng chữ số, ngoại trừ chỉ cho phép số nguyên chữ.

Vì vậy, n+1 chỉ khớp với nhau nếu n ít nhất là 1, như bạn nghi ngờ. Mã thay thế của bạn loại bỏ hạn chế này, dẫn đến các kết quả trùng lặp mẫu.

+0

"Đó là trường hợp cụ thể của những gì được gọi là" n + k mẫu ", thường không thích". Tôi nghĩ rằng giải pháp tốt hơn có thể đã được giới thiệu một loại cho số tự nhiên, có thể được sử dụng để thể hiện * kích thước *, và xác định các * n + 1 * mô hình trên naturals. Thiếu loại này trong Haskell và hầu hết các ngôn ngữ, như C/C++, chúng ta thấy những khó khăn trong việc xác định 'unsigned int',' size_t' (thực sự là naturals dưới mui xe) và các vấn đề liên quan so sánh giữa loại đã ký và unsigne vv. Naturals, chúng ta có thể phân tích trường hợp về kích thước của các cấu trúc, khá cơ bản và dễ dàng trong Haskell. – tinlyx

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