tôi có mã này:Tổng quát "chuỗi" cho tất cả các functors?
fmapM :: Monad m => (a -> m b) -> (t, a) -> m (t, b)
fmapM f (id, e) = do
ev <- f e
return (id, ev)
mà về cơ bản áp dụng cho các chức năng để các yếu tố thứ 2 trong tuple và sau đó "chiết xuất" các đơn nguyên. Kể từ khi tuple là một functor, có cách nào để khái quát hóa điều này cho tất cả các functors? Tôi không thể nghĩ ra một thực hiện, nhưng chữ ký loại nên là:
fmapM :: (Monad m, Functor f) => (a -> m b) -> f a -> m f b
nó sẽ có vẻ như bước 2 sẽ là một "chuỗi" hoạt động, trong đó trích xuất các đơn nguyên từ một functor (danh sách). Nhưng trình tự không được tổng quát hóa cho tất cả các functors. Bạn có thể đưa ra một triển khai chung về fmapM không?
Chỉnh sửa: Tôi đã nhận ra rằng phiên bản cũ của ôm đã thực hiện chức năng này. Tuy nhiên, tôi không thể tìm thấy mã. Bây giờ, tôi khuyên rằng tôi nên sử dụng có thể gập/di chuyển được để đạt được điều tương tự.
Ah, tôi thấy 'fmapM' bạn muốn nói đến trong Hugs cũ, nhưng đó chỉ là phiên bản ít phổ biến hơn của' Traversable'. Nó vẫn là một lớp với một triển khai khác nhau cho từng loại. – shachaf
(Bạn có thể lấy được 'fmap' - cũng như nhiều hàm khác - chỉ từ' đi ngang', nhưng không ngược lại.) – shachaf