我想要理解,为什么Maybe类型是一个协变函子?
协变是什么意思?
请举例说明。
发布于 2019-03-19 07:44:38
协变函子只是普通的Functor类:
class Functor f where
fmap :: (a -> b) -> f a -> f b例如,Maybe (正如您所提到的):
instance Functor Maybe where
fmap _ Nothing = Nothing
fmap f (Just a) = Just (f a)然而,还有另一种函子:反变体函子。它们的定义如下:
class Contravariant f where
contramap :: (a -> b) -> f b -> f a请注意,与fmap相比,contramap颠倒了b和a的顺序。
fmap :: Functor f => (a -> b) -> f a -> f b
contramap :: Contravariant f => (a -> b) -> f b -> f a
-- ^ ^
-- look!现在,这个疯狂的Contravariant类甚至有任何实例吗?嗯,是的。例如,下面是Predicate的定义
newtype Predicate x = Predicate { decide :: x -> Bool }换句话说,Predicate x是计算x上的条件的函数。我们可以专门从contramap到Predicate的:
contramap :: (a -> b) -> Predicate b -> Predicate a相当于:
contramap :: (a -> b) -> (b -> Bool) -> (a -> Bool)基本上,给定一个Predicate on b,以及一个从a到b的映射,您可以contramap来获得a上的Predicate。(我将把实现作为一个练习。)下面是一个示例(未经测试):
hasMultChars :: Predicate String
hasMultChars = Predicate $ \x -> length x > 1
showInt :: Int -> String
showInt = show
intHasMultChars :: Predicate Int
intHasMultChars = contramap showInt hasMultChars事实证明,与普通的协变函子相比,反变函子不那么常见--也就没那么有用了。所以在实践中,我们忽略了“协变”,因为它在大多数情况下并没有增加任何东西。
发布于 2019-03-19 07:44:27
协变函子是指“内”和“外”箭头指向同一方向的函子。
class Functor f where
fmap :: (a -> b) -> (f a -> f b)反变函子是指“内”和“外”箭头指向相反方向的函子。
class Contravariant f where
contramap :: (a -> b) -> (f a <- f b)...or,使用适当的Haskell语法,
contramap :: (a -> b) -> (f b -> f a)这通常表示参数类型作为数据类型中的函数参数出现在某个地方,如
data DepInt x = DepInt (x -> Int)
instance Contravariant DepInt where
contramap f (DepInt g) = DepInt $ g . f相反,如果该参数只显示为- is或函数箭头的右边,则它是一个协变函子。这是大多数函子的情况,这就是为什么这个类被简单地称为Functor。
https://stackoverflow.com/questions/55235467
复制相似问题