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.
"Đó 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