Tôi không nghĩ rằng có một cách để làm điều đó trực tiếp, thật không may. Với hàm bạn có thể sử dụng flip
để áp dụng một phần đối số thứ hai, nhưng điều đó không hoạt động với các hàm tạo kiểu như Either
.
Điều đơn giản nhất có lẽ là gói nó trong một newtype
:
newtype Mirror b a = Mirrored (Either a b)
instance Functor (Mirror e) where
fmap _ (Mirrored (Right a)) = Mirrored $ Right a
fmap f (Mirrored (Left b)) = Mirrored $ Left (f b)
Wrapping với newtype
cũng là cách tiêu chuẩn để tạo ra nhiều trường hợp cho một loại duy nhất, chẳng hạn như Sum
và Product
là trường hợp của Monoid
cho số loại. Nếu không, bạn chỉ có thể có một phiên bản cho mỗi loại.
Bên cạnh đó, tùy thuộc vào những gì bạn muốn làm, tùy chọn khác là để bỏ qua Functor
và xác định lớp kiểu riêng của bạn như thế này:
class Bifunctor f where
bimap :: (a -> c) -> (b -> d) -> f a b -> f c d
instance Bifunctor Either where
bimap f _ (Left a) = Left $ f a
bimap _ g (Right b) = Right $ g b
instance Bifunctor (,) where
bimap f g (a, b) = (f a, g b)
Rõ ràng, lớp đó là gấp đôi so với nhiều niềm vui như một thường xuyên Functor
. Tất nhiên, bạn không thể thực hiện một ví dụ Monad
trong số đó rất dễ dàng.
Nguồn
2010-02-25 17:29:57
Liên quan: http://stackoverflow.com/questions/1827645 Tóm lại, không thể thực hiện được trong Haskell như hiện tại. – ephemient
Như một sang một bên, tiêu đề của câu hỏi này có phần không rõ ràng, nhưng tôi không chắc điều gì sẽ tốt hơn. –
Tôi đã đề xuất một tiêu đề chính xác hơn. –