Tôi muốn có một hàm để ánh xạ một hàm thuần túy cho một vùng chứa hoặc sắp xếp chuỗi hành động đơn/đơn lẻ thông qua nó. Để lập bản đồ tinh khiết chúng tôi cóFunctor là dành cho (a -> b) -> (f a -> f b), cái gì cho (Danh mục c) => c a b -> c (f a) (f b)?
fmap :: Functor f => (a -> b) -> (f a -> f b)
Đối với trình tự monadic chúng tôi có (từ Data.Taversable)
mapM :: (Traversable f, Monad m) => (a -> m b) -> (f a -> m (f b))
Đó là tương tự như
mapKleisli :: (Traversable f, Monad m) => Kleisli m a b -> Kleisli m (f a) (f b)
mapKleisli = Kleisli . mapM . runKleisli
Chúng tôi biết cả hai (->) và (Kleisli m) là các loại (và các mũi tên). Vì vậy, nó là tự nhiên để làm cho một generalisation:
mapCategory :: (X f, Category c) => c a b -> c (f a) (f b)
Bạn có biết một lớp X với phương pháp tương tự? Có lẽ, ở đâu đó trên hackage? Tôi đã cố gắng để hoogle/hayoo nhưng không tìm thấy bất cứ điều gì thích hợp.
Cập nhật:
Bây giờ tôi biết rõ hơn những gì tôi cần. Cả hai mũi tên Kleisli và (->) đều là các cá thể của ArrowApply mạnh mẽ như Monad. Tôi đã đưa ra phiên bản này mũi tên dựa trên Travesable:
{-# LANGUAGE TypeOperators #-}
import Prelude hiding (id, (.), mapM)
import Control.Arrow
import Control.Category
class Traversable f where
traverse :: ArrowApply (~>) => f a -> (a ~> b) ~> f b
mapArrow :: (ArrowApply (~>), Traversable f) => a ~> b -> f a ~> f b
mapArrow a = arr (\x -> (traverse x, a)) >>> app
instance Traversable Maybe where
traverse Nothing = arr (const Nothing)
traverse (Just x) = arr (\a -> (a, x)) >>> app >>> arr Just
instance Traversable [] where
traverse [] = arr (const [])
traverse (x : xs) = undefined -- this is hard!
tôi có thể sử dụng chỉ thường applicative dựa trên traversable, đậm đà bản sắc cho các chức năng thuần túy, nhưng tôi không chắc chắn rằng nó là tốt. Xem xét các chức năng thuần túy như trường hợp đặc biệt của các hành động monadic là lạ. Giải thích cả hai hàm thuần túy và các hành động monadic như các cá thể của một số lớp hành động (Category/Arrow/ArrowApply) trông đơn giản hơn với tôi.
Câu hỏi: bạn có muốn hoàn thành bản sao cho []
không? Ý kiến của tôi về ArrowApply vs Monad có ý nghĩa gì không?
Cảm ơn câu trả lời, nhưng trong trường hợp này tôi có nhiều sự quan tâm thực tế hơn lý thuyết. [Trong gói danh mục] (http://hackage.haskell.org/packages/archive/categories/0.56.0/doc/html/Control-Categorical-Functor.html) chúng tôi chỉ có (Endo) Functor trường hợp cho (->) thể loại mà cho chúng ta không có gì mới so với những gì chúng tôi có trong cơ sở (ngoại trừ bản thân lớp). – modular
@ user713303: Bạn được tự do viết các phiên bản của riêng mình. Ví dụ, nó sẽ rất đơn giản để làm như vậy cho các mũi tên Kleisli, như bạn đã thể hiện trong câu hỏi của bạn. –
Trong thực tế, nếu bạn có thực tế và hữu ích trường hợp trong tâm trí, tại sao không đóng góp chúng? Đây là [trang github] (https://github.com/ekmett/categories) cho gói. –