问题标签 [contravariant]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
709 浏览

haskell - 不是逆变/逆变/可分/可判定的好例子?

类型类Contravariant家族代表了 Haskell 生态系统中的标准和基本抽象:

但是,要理解这些类型类背后的概念并不容易。我认为如果您能看到一些反例,将有助于更好地理解这些类型类。那么,本着Not a Functor/Functor/Applicative/Monad 的好例子的精神?,我正在寻找满足以下要求的数据类型的对比示例:

  • 不是Contravariant?的类型构造函数
  • 一个类型构造函数,它是 a Contravariant,但不是Divisible?
  • 一个类型构造函数,它是 a Divisible,但不是 a Decidable
  • 类型构造函数是Decidable?
0 投票
1 回答
118 浏览

haskell - 学习如何在预期 (a -> Maybe b) 而不是 (a -> b) 作为第一个参数时使用 contramap (Haskell)

我正在学习 Haskell,我被要求解决这个练习:

实现一个名为 NovoPred 的新数据类型,它应该有一个同名的值构造函数。它还应该有一个名为 runNovoPred 的字段,类型为 Maybe a -> Bool 然后,为 NovoPred 类型创建一个 Functor 逆变实例

为了解决这个练习,我做了这个解决方案:

您可能会注意到,此解决方案根本不起作用。Contramap需要有这个结构:(a -> b) -> f b -> f a,问题是x函数期望接收一个看起来像的值,Maybe b它实际上正在接收一个值b,因为这是y函数返回的。因此,这是不可能的x . y,因为期望收到一个与实际返回x的值不匹配的值。y

所以,我想我需要一种方法让y函数返回一个 type 的值Maybe b。不幸的是,我不知道如何做到这一点,因为contramap期望收到类似a -> b第一个参数的东西而不是类似的东西a -> Maybe b(这就是我需要的)。你能帮我解决这个问题吗?

0 投票
1 回答
49 浏览

scala - 关于逆变类型的2类定义之间的区别?

错误:逆变类型 T 出现在值 other 的类型 T 中的协变位置

然而这个成功了

有什么区别?

谢谢

0 投票
3 回答
430 浏览

scala - Scala中的协变和逆变

我在理解协方差类型受方法参数限制时感到困惑。我通读了许多材料,但无法将它们理解为以下概念。

在上面这段代码中,a 的类型是 T。为什么我们不能传递 T 的子类型?方法对参数 x 的所有期望,都可以通过 T 的子类型完美地满足。

同样,当我们有逆变类型 T (-T) 时,它不能作为方法参数传递;但这是允许的。为什么我认为它不能被传递是:例如,说方法调用 T 中存在的 a 上的方法(存在于对象 a 中)当我们传递 T 的超类型时,它可能不存在。但它是编译器允许的。这让我很困惑。

因此,通过查看上述内容,在方法参数和返回类型中应该允许协变。不能应用逆变。

有人可以帮我理解。

0 投票
2 回答
57 浏览

scala - Scala中的逆变用法

根据逆变的定义(将接受超类实例),我在下面的代码片段中的最后一条语句应该被接受;但它会抛出类型错误。请您纠正我的理解。

不过 x.set(new C)还好!因此,即使“逆变参数被接受为方法参数”实际上也是协变参数。

0 投票
1 回答
37 浏览

c# - 如何在基类中使用逆变参数?

在 ASP.NET Web API 2.0 项目中,我想使用数据模型中的 HTTP 动词GET和类似对象进行访问,所有这些都实现了 interface 。所以我有一个基类,提供访问这些模型类的默认实现:POSTITableRow

和一个想要使用ControllerBase默认实现的派生类Post()

使用 GET 路由很容易,但是调用 POST 路由时会出现问题:

通过 Post 的 Web API 2.0 框架的自动调用现在调用该ElementsController.Post()方法,但无法创建元素对象,因为它只知道必须将ITableRecord对象构建为值 - 由于这只是一个接口,因此变量value保持null.

现在我可以在每个派生类中编写 的特定定义,从那里Post()调用:ControllerBase.Post()

我的问题是:有没有更好的(比如:更 DRY)方法来告诉派生类Post()方法的参数必须是哪种特定类型,没有?

0 投票
2 回答
103 浏览

c# - 使用泛型委托时如何理解逆变?

我正在学习“逆变通用委托”。

我的理解是:

“in”关键字指定类型参数是逆变的。
这允许隐式转换委托类型。

如果没有“in”关键字,我们不知道类型参数是否是逆变的。
那么委托类型的隐式转换是不允许的。

这是我的代码:

我的问题

这条线与我的理解一致。

我不明白这一行:

"bool BaseFunc(BaseClass bc)" 可以隐式转换为 bool "FuncDelegate<DerivedClass>(DerivedClass t)"。

我认为它必须有“in”关键字来指定逆变。

但是可以在没有“in”关键字的情况下完成转换。