2015-11-06 9 views
11

Đêm qua, tôi đã viết một số mã giải trí và tại một số thời điểm, tôi đã thay thế concatMap bằng >>= và thấy tăng tốc 10% trong mã của mình.Tại sao >> = nhanh hơn concatMap khi chúng phải giống nhau?

Tôi đã bị ấn tượng về định nghĩa >>= cho [] chính xác là concatMap, vì vậy tôi hơi bối rối.

Trả lời

8

Trong cơ sở 4.8 (>>=) được thực hiện (xem here) như:

xs >>= f = [y | x <- xs, y <- f x] 

concatMap đang sử dụng một người thợ xây phức tạp hơn (nguồn here)

concatMap :: Foldable t => (a -> [b]) -> t a -> [b] 
concatMap f xs = build (\c n -> foldr (\x b -> foldr c b (f x)) n xs) 
+1

Thú vị. Tôi không thể không nghĩ rằng một 'Có thể gập lại' cũng là một' Thay thế' tương đương với một 'Monad' .... – AJFarmar

+0

@AJFarmar tại sao bạn lại nghĩ vậy? Tôi không biết làm thế nào mà làm cho bất kỳ ý nghĩa – Emil

+0

@ user3217013 'bind 'fa f = foldr (<|>) trống $ foldr (:) [] (fmap f fa)' trong đó 'bind' :: (Có thể gập lại f, Áp dụng f) => fa -> (a -> fb) -> fb'. QED. – AJFarmar

Các vấn đề liên quan