gpt4 book ai didi

haskell - 什么是协变仿函数?

转载 作者:行者123 更新时间:2023-12-02 06:48:14 26 4
gpt4 key购买 nike

我想了解,为什么Maybe类型是协变仿函数?

协变是什么意思?

请提供一个示例来说明。

最佳答案

协变仿函数只是普通的仿函数类:

class Functor f where
fmap :: (a -> b) -> f a -> f b

例如,也许(正如您所说):

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 颠倒了 ba 的顺序:

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)

基本上,给定 b 上的 谓词,以及从 as 的映射bs,您可以使用 contramap 来获取 as 上的 Predicate。 (我将把实现作为练习。)这是一个示例(未经测试):

hasMultChars :: Predicate String
hasMultChars = Predicate $ \x -> length x > 1

showInt :: Int -> String
showInt = show

intHasMultChars :: Predicate Int
intHasMultChars = contramap showInt hasMultChars

事实证明,逆变仿函数比正常的协变仿函数要少得多,因此用处也少得多。因此,在实践中,我们忽略了“协变”,因为它在大多数情况下不会添加任何内容。

关于haskell - 什么是协变仿函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55235467/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com