gpt4 book ai didi

haskell - 什么是逆变仿函数?

转载 作者:行者123 更新时间:2023-12-04 07:39:47 25 4
gpt4 key购买 nike

这种类型让我大吃一惊:

class Contravariant (f :: * -> *) where
contramap :: (a -> b) -> f b -> f a

然后我读了 this ,但与标题相反,我没有更多的开明。

有人可以解释一下什么是逆变仿函数和一些例子吗?

最佳答案

我知道这个答案不会像其他答案那样学术性很强,但它只是基于你会遇到的逆变的常见实现。

首先,提示:不要阅读 contraMap f 使用相同的心理隐喻的函数类型正如你在阅读优秀的 ol' Functor 的 map 时所做的那样.

你知道你是怎么想的:

"a thing that contains (or produces) an t"



...当您阅读 f t 之类的类型时?

好吧,在这种情况下,您需要停止这样做。

逆变仿函数是经典仿函数的“对偶”,所以当你看到 f acontraMap ,你应该想到“双重”的比喻:

f t is a thing that CONSUMES a t



现在 contraMap的类型应该开始有意义:
contraMap :: (a -> b) -> f b ...
...停在那里,类型是完全明智的:
  • “产生” b 的函数.
  • “消耗” b 的东西.

  • 第一个参数 cooking b .第二个参数吃掉 b .

    有道理,对吧?

    现在完成编写类型:
    contraMap :: (a -> b) -> f b -> f a
    所以最后这个东西必须产生一个“ a 的消费者”。

    好吧,我们当然可以构建它,因为我们的第一个参数是一个接受 a 的函数。作为输入。

    一个函数 (a -> b)应该是构建“ a 的消费者”的良好构建 block 。

    所以 contraMap基本上可以让您创建一个新的“消费者”,如下所示(警告:输入符号):
    (takes a as input / produces b as output) ~~> (consumer of b)
  • 在我虚构符号的左侧:contraMap 的第一个参数(即 (a -> b) )。
  • 右边:第二个参数(即 f b )。
  • 整个事情粘在一起:contraMap 的最终输出(知道如何使用 a 的东西,即 f a )。
  • 关于haskell - 什么是逆变仿函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38034077/

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