【发布时间】:2018-02-02 16:52:33
【问题描述】:
我阅读了很多关于 contramap 的文章,发现 https://hackage.haskell.org/package/contravariant-1.4.1/docs/Data-Functor-Contravariant.html#g:3 是最好的。
反正我找到了,例如如何使用:
*Lib Data.Functor.Contravariant> a = Predicate (\x -> x > 20)
*Lib Data.Functor.Contravariant> :t contramap
contramap :: Contravariant f => (a -> b) -> f b -> f a
*Lib Data.Functor.Contravariant> :t contramap (\x -> x * 2)
contramap (\x -> x * 2) :: (Num b, Contravariant f) => f b -> f b
*Lib Data.Functor.Contravariant> :t contramap (\x -> x * 2) a
contramap (\x -> x * 2) a :: (Ord b, Num b) => Predicate b
*Lib Data.Functor.Contravariant> x = contramap (\x -> x * 2) a
*Lib Data.Functor.Contravariant> getPredicate x 45
True
但不知道它在哪里有用。
在我上面发布的网站上,它说:
而在 Haskell 中,可以将 Functor 视为包含或 产生值,逆变函子是一个函子,它可以 被认为是消费价值。
看函子的定义:
class Functor (f :: * -> *) where
fmap :: (a -> b) -> f a -> f b
它使用a 类型的值并产生b 类型的值。在contramap 上,它会消耗该值。
class Contravariant (f :: * -> *) where
contramap :: (a -> b) -> f b -> f a
它使用a 或b 哪个变量类型?
还有来自https://www.fpcomplete.com/blog/2016/11/covariance-contravariance 的关于正面和负面立场的问题。网站上写着:
- 正位:类型变量是 函数的结果/输出/范围/余域
- 负位置:类型变量是参数/输入/域 函数
查看 contramap 类型定义:
contramap :: (a -> b) -> f b -> f a
作者指的是哪个类型的变量?
【问题讨论】:
-
你误解了引用部分的意思;但它也不是很清楚的语言,你应该避免阅读任何以“可以想到......”开头的解释。也就是说,这意味着“一个 Functor”(对于一些
F和Functor F和一些A的值x :: F A)可以被认为是产生A类型值的计算;并且逆变函子可以被认为是消耗A类型的值。
标签: haskell