Bạn có thể chuyển đổihình thức Point-miễn phí so với phong cách
-- tupleUnfold :: forall a. ((forall b. a -> b)) -> a -> ((b))
tupleUnfold :: Int -> ExpQ
tupleUnfold n = do
xs <- forM [1 .. n] (const . newName $ "x")
y <- newName "y"
let y' = varE y
g (ps', es') x = (varP x : ps', appE (varE x) y' : es')
(ps, es) = foldl' g ([], []) xs
lamE [tupP ps, varP y] (tupE es)
để pointfree phong cách trong khi duy trì sự rõ ràng (tôi biết chương trình 'pointfree', nhưng không muốn xáo trộn mã thậm chí nhiều hơn)?
Dù bằng cách nào, những thay đổi nào có thể được thực hiện để cải thiện phong cách của chức năng hoặc làm cho mục đích của nó rõ ràng hơn? Chức năng này được thiết kế để sử dụng như dưới đây.
$(tupleUnfold 3) ((+ 1), (+ 2), (+ 3)) 2
-- (3, 4, 5)
Quy ước đặt tên tốt hơn để sử dụng (xem các biến ps, ps ', es và es') là gì?
Tôi thích việc sử dụng "replicateM" - không chắc chắn làm thế nào tôi bỏ lỡ một số – ScootyPuff
Tôi đánh dấu câu trả lời này là câu trả lời đúng một cách tùy ý. Mặc dù cái kia là vô nghĩa ở cấp cao nhất, nhưng điều này dường như đại diện cho luồng và chuyển đổi tốt hơn - mặc dù nó hơi khó đọc hơn. – ScootyPuff
Một phần lý do của nếp gấp (thay vì bản đồ) là để tránh nhiều lần di chuyển. Tôi cũng biết rằng GHC khá giỏi trong việc hợp nhất các danh sách tra cứu. Nó thường là một sự khác biệt đáng kể? Cho rằng cả hai hình thức là tương đối dễ dàng để viết, mà nên (như một quy tắc của ngón tay cái) được ưa thích? – ScootyPuff