Tôi luôn viết của tôi danh sách sản xuất chức năng đệ quy ở định dạng này:Haskell Danh sách Concatenation vs (đầu: đuôi) định dạng
recursiveFunc :: [a] -> [b]
recursiveFunc (x:xs) = [change x] ++ resursiveFunc xs where
change :: a -> b
change x = ...
Tôi nhận ra bất kỳ chức năng như trên có thể được viết cho các trường hợp a -> b
và sau đó đơn giản chỉ cần map
được chỉnh sửa trên một tập hợp [a]
, nhưng vui lòng thực hiện ví dụ này xuống dưới nước.
HLint đề nghị thay thế [change x] ++ recursiveFunc xs
bằng change x : recursiveFunc xs
.
Đây có phải là gợi ý hoàn toàn thẩm mỹ, hoặc có một số ảnh hưởng đến cách Haskell thực thi chức năng này không?
Vâng, với một đối số đầu tiên của phần tử đơn, '++' * sẽ * chỉ là 'cons' một lần và sau đó thoát, nhưng đó là cách rất vòng để thêm một giá trị duy nhất. – delnan
Phiên bản của bạn có lợi thế là nếu vào một thời điểm nào đó bạn quyết định sửa đổi chức năng của mình sao cho có nhiều hơn một phần tử được thêm vào danh sách, thì sẽ ít thay đổi hơn. –
đề xuất hlint không thay đổi kết quả của biểu thức. –