Tôi đang cố gắng để thực hiện một chức năng tương đối đơn giản đó là gần như concat nhưng với một chút xoắn. Đó là nghĩa vụ phải nhị phân hoặc cùng nhau các yếu tố cuối cùng và đầu tiên của mỗi danh sách và kết hợp chúng trong quá trình này. Tôi đang nghiên cứu để viết mã có thể tận dụng khả năng của Stream Fusion trong Data.List.StreamTrong Haskell, concat xây dựng một danh sách uể oải nhưng phiên bản của riêng tôi với một twist, không
Tôi đã kiểm tra rằng concat trong cơ sở thực hiện những gì cần và xây dựng danh sách một cách lười biếng, tuy nhiên, phiên bản này tôi không được tạo. tại các cơ sở, concat được quy định như sau:
concat :: [[a]] -> [a]
concat = foldr (++) []
(++) :: [a] -> [a] -> [a]
(++) [] ys = ys
(++) (x:xs) ys = x : xs ++ ys
Dưới đây là mã của tôi:
bconcat :: [[Word8]] -> [Word8]
bconcat = foldr1 bappend
bappend :: [Word8] -> [Word8] -> [Word8]
bappend as bs = init as ++ (last as .|. head bs) : tail bs
Các câu hỏi tôi có được, làm thế nào để tôi viết những dòng này để danh sách được xây dựng một cách lười biếng? Tôi thậm chí đã cố gắng viết bappend bằng cách bắt chước định nghĩa (++) trong cơ sở nhưng nó không tạo ra sự khác biệt.
Hiện tại, tôi sử dụng mã sau đây, nó hoạt động theo cách tôi muốn nhưng hiệu suất tụt lại phía sau concat. Ngoài ra, nó sử dụng đệ quy rõ ràng mà tôi muốn tránh.
bconcat :: [[Word8]] -> [Word8]
bconcat (a:b:xs) = init a ++ bconcat ((bappend (last a) b):xs)
bconcat (a:[]) = a
bconcat [] = []
bappend :: Word8 -> [Word8] -> [Word8]
bappend !a bs = (a .|. head bs) : tail bs
Vì vậy, câu hỏi tôi có là, làm thế nào để viết mã này để nó xây dựng danh sách một cách lười biếng và không có đệ quy rõ ràng?
Cảm ơn bạn đã dành thời gian.
Edit:
quan tâm chính của tôi, cho thời điểm này, là làm cho mã sạch, súc tích và understable với combinators chuẩn. Tôi vẫn còn rất nhiều người mới bắt đầu với tư duy chức năng và rất thích nhìn thấy một cách hiệu quả để đưa họ vào sử dụng ở đây.
Tôi đoán rằng, vấn đề là, bạn phải đánh giá toàn bộ danh sách đầu tiên trước khi có thể hoặc cùng nhau. IMHO không có đánh giá lười biếng có thể. – fuz
Có chắc chắn là một cách để làm cho nó xây dựng danh sách kết quả uể oải. concat thành công ở đó và nó gần như giống nhau. Ngoài ra, đoạn trích cuối cùng tôi đăng không làm theo cách tôi muốn. Nó chỉ không đạt đến mức hiệu suất của concat. – Elriel
Tôi thấy sự khác biệt, phiên bản OR đầu tiên (cuối cùng) với số –