Hãy tưởng tượng bạn cần phải gấp trên một chuỗi, và muốn biết các giá trị trung gian tại một số điểm dọc theo dãy. Đây là những gì tôi đã sử dụng cho việc này:Mẫu gấp và lặp này là gì?
[a,b,c] = map fst . tail $ chain [g i, g j, g k] (zero, sequence)
g :: Integer -> (a,b) -> (a,b)
chain (f:fs) x = x : chain fs (f x)
chain [] x = [x]
Chức năng g
tiêu thụ một phần nhất định một chuỗi đầu vào (chiều dài i
, j
, vv), bắt đầu với một số giá trị ban đầu và sản xuất kết quả của cùng một loại, để được đưa vào lời gọi tiếp theo. Tiêu thụ trình tự nhiều lần cho các độ dài khác nhau bắt đầu lại từ đầu và giá trị ban đầu giống nhau sẽ không hiệu quả, cả về thời gian và không gian thông minh.
Vì vậy, một mặt chúng tôi gấp qua chuỗi số nguyên này - các điểm tạm thời trên chuỗi; mặt khác, chúng tôi lặp lại chức năng này, g
. Nó là gì? Tôi có thiếu cái gì cơ bản ở đây không? Điều này có thể được bằng cách nào đó thể hiện với tiết mục thường xuyên của nếp gấp, vv?
EDIT: giải quyết: ở trên chỉ đơn giản là
[a,b,c] = map fst . tail $ scanl (flip g) (zero, sequence) [i, j, k]
thú vị như thế nào một sự lặp lại sửa đổi thực sự là gấp qua danh sách các bộ điều chỉnh.
Về cơ bản bạn có nghĩa là scanl? http://www.haskell.org/hoogle/?hoogle=scanl – Marcin
@Marcin ah, vâng, những thứ cơ bản. Chắc là đúng. Điều làm tôi bối rối là bản thân 'g' cũng gấp nếp theo thứ tự. Tôi đoán chức năng quét sẽ kết hợp '(zero, sequence)' với 'i' và quét qua danh sách' [i, j, k] 'trực tiếp ... Cảm ơn, sẽ thử điều đó! –