问题标签 [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.
haskell - 不是逆变/逆变/可分/可判定的好例子?
类型类Contravariant
家族代表了 Haskell 生态系统中的标准和基本抽象:
但是,要理解这些类型类背后的概念并不容易。我认为如果您能看到一些反例,将有助于更好地理解这些类型类。那么,本着Not a Functor/Functor/Applicative/Monad 的好例子的精神?,我正在寻找满足以下要求的数据类型的对比示例:
- 不是
Contravariant
?的类型构造函数 - 一个类型构造函数,它是 a
Contravariant
,但不是Divisible
? - 一个类型构造函数,它是 a
Divisible
,但不是 aDecidable
? - 类型构造函数是
Decidable
?
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
(这就是我需要的)。你能帮我解决这个问题吗?
scala - 关于逆变类型的2类定义之间的区别?
错误:逆变类型 T 出现在值 other 的类型 T 中的协变位置
然而这个成功了
有什么区别?
谢谢
scala - Scala中的协变和逆变
我在理解协方差类型受方法参数限制时感到困惑。我通读了许多材料,但无法将它们理解为以下概念。
在上面这段代码中,a 的类型是 T。为什么我们不能传递 T 的子类型?方法对参数 x 的所有期望,都可以通过 T 的子类型完美地满足。
同样,当我们有逆变类型 T (-T) 时,它不能作为方法参数传递;但这是允许的。为什么我认为它不能被传递是:例如,说方法调用 T 中存在的 a 上的方法(存在于对象 a 中)。当我们传递 T 的超类型时,它可能不存在。但它是编译器允许的。这让我很困惑。
因此,通过查看上述内容,在方法参数和返回类型中应该允许协变。不能应用逆变。
有人可以帮我理解。
scala - Scala中的逆变用法
根据逆变的定义(将接受超类实例),我在下面的代码片段中的最后一条语句应该被接受;但它会抛出类型错误。请您纠正我的理解。
不过 x.set(new C)
还好!因此,即使“逆变参数被接受为方法参数”实际上也是协变参数。
c# - 如何在基类中使用逆变参数?
在 ASP.NET Web API 2.0 项目中,我想使用数据模型中的 HTTP 动词GET
和类似对象进行访问,所有这些都实现了 interface 。所以我有一个基类,提供访问这些模型类的默认实现:POST
ITableRow
和一个想要使用ControllerBase
默认实现的派生类Post()
:
使用 GET 路由很容易,但是调用 POST 路由时会出现问题:
通过 Post 的 Web API 2.0 框架的自动调用现在调用该ElementsController.Post()
方法,但无法创建元素对象,因为它只知道必须将ITableRecord
对象构建为值 - 由于这只是一个接口,因此变量value
保持null
.
现在我可以在每个派生类中编写 的特定定义,从那里Post()
调用:ControllerBase.Post()
我的问题是:有没有更好的(比如:更 DRY)方法来告诉派生类Post()
方法的参数必须是哪种特定类型,没有?
c# - 使用泛型委托时如何理解逆变?
我正在学习“逆变通用委托”。
我的理解是:
“in”关键字指定类型参数是逆变的。
这允许隐式转换委托类型。如果没有“in”关键字,我们不知道类型参数是否是逆变的。
那么委托类型的隐式转换是不允许的。
这是我的代码:
我的问题
这条线与我的理解一致。
我不明白这一行:
"bool BaseFunc(BaseClass bc)" 可以隐式转换为 bool "FuncDelegate<DerivedClass>(DerivedClass t)"。
我认为它必须有“in”关键字来指定逆变。
但是可以在没有“in”关键字的情况下完成转换。