Tôi có cấu trúc kiểu đệ quy và tôi muốn lấy danh sách tất cả các cấu trúc con bao gồm toàn bộ cấu trúc - tức là tương đương với chức năng tails
trên List
. Tôi nghĩ rằng nó có thể thực hiện điều này bằng cách gọi para
, ánh xạ trở lại cấu trúc ban đầu ở mỗi bước, và sau đó gắn kết cấu trúc ban đầu ở phía trước một cách riêng biệt, nhưng điều đó có vẻ rất cồng kềnh: (chưa được kiểm chứng, xin lỗi nếu Haskell không chính xác; bằng văn bản về Mu
như tôi đã không thực sự hiểu được Base
xây dựng chưa)Cấu trúc kiểu đệ quy của `tails`
gtails :: Functor f => Mu f -> [Mu f]
gtails = para (\a -> (fmap fst a) : (foldMap snd a))
(tức là trong trường hợp f=Prim
đây là tails
, cho f
khác, nó là một sự tổng quát)
có cách nào đẹp hơn ? Tôi nhận thấy điều này không quá tệ, nhưng fmap fst a
để khôi phục cấu trúc "ban đầu" ở bước đó cảm thấy khá cồng kềnh và foldMap snd a
là thứ tôi thấy mình lặp lại rất nhiều khi sử dụng para
(tương tự fold a
khi sử dụng cata
nó không cần thiết).
Tôi cần một phiên bản về đệ quy-chương trình bởi vì trường hợp thực tế của tôi không phải là 'List' mà là cấu trúc kiểu lược đồ đệ quy. AIUI đệ quy-đề án 'para' là' para :: Có thể gập lại t => (Cơ sở t (t, a) -> a) -> t -> a' không có tham số 'b' từ ví dụ của bạn. Bạn có thể đưa ra một phiên bản trong điều khoản của 'para' này (hoặc mã đệ quy-chương trình khác) đó là' tails' nếu chúng ta gọi nó với 'tfa = Maybe (a, f)' (theo nghĩa 'Base t' là sau đó isomorphic để 'List', trừ khi tôi là nhầm lẫn) nhưng cũng có thể được gọi với' t' khác? – lmm
@lmm Xem chỉnh sửa; Tôi hy vọng đây là những gì bạn có ý nghĩa. –
'Prim' có vẻ là một điều đặc biệt của' List', trong khi tôi muốn một phiên bản hoạt động cho các cấu trúc dữ liệu không phải danh sách, và tôi không nghĩ rằng tôi nhất thiết phải luôn định nghĩa một 'Base t ~ Prim [a]' ? Hàm tôi đang nghĩ đến không cần bất kỳ ràng buộc bổ sung nào - tôi đã cập nhật câu hỏi bằng cách triển khai mà tôi cho là hợp lệ (nhưng tôi mong đợi đó là hàm chuẩn hoặc ít nhất là ngắn gọn hơn phiên bản). – lmm