表明`newtype T a = T(a-> Int)`是不是构造函数的类型构造函数

乔治

有人声称这newtype T a = T (a -> Int)是一个类型构造函数,它不是函子(而是逆变函子)。为何如此?或什么是逆函子(因此我很清楚为什么不能将其设为普通函子)?

限制

给定

newtype T a = T (a -> Int)

让我们尝试Contravariant为此数据类型构建实例。

这是有问题的类型类:

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

基本上,contramap是类似于fmap,但而不是提升的功能a -> bf a -> f b,它抬起它f b -> f a

让我们开始编写实例...

instance Contravariant T where
  contramap g (T f) = ?

在填写之前?,我们先考虑一下g的类型f

g :: a -> b
f :: b -> Int

为了清楚起见,我们不妨提到

f a ~ T (a -> Int)
f b ~ T (b -> Int)

因此我们可以填写?以下内容:

instance Contravariant T where
  contramap g (T f) = T (f . g)

是超级迂腐,你可能会重命名gaToBf作为bToInt

instance Contravariant T where
  contramap aToB (T bToInt) = T (bToInt . aToB)

您可以为编写Contravariant实例的原因T a归结a为在中处于相反位置的事实T (a -> Int)说服自己T a不是最好的方法Functor是尝试(失败)自己编写Functor实例。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何理解Coq类型构造函数var(t:T)

为什么.NET Core DI首选构造函数而不是无参数构造函数接受IEnumerable <T>?

scala 将 T 类型传递给 Java 构造函数

为什么我需要类型T的副本构造函数?

通用构造函数接受类型T的类对象,并返回T,这次T是一个List

当T = int&时,为什么构造函数Message(const T && data)与Message(T && data)冲突?

从类型<T1>的对象创建类型为<T>的对象的构造函数

剥离newtype构造函数

为什么将func <T>传递给构造函数而不是T?

尝试从 dart mixin 调用类构造函数时,错误 T 不是函数

类/构造函数为Action <T>?

std :: nullopt_t构造函数原理

合并参数和IList <T>构造函数

Flutter Series <T,D>构造函数

vector <T> :: push_back()是否调用任何类型为T的匹配构造函数?

如何检查类型'T'是否具有'T(std :: initializer_list <U>)'构造函数

如何根据is_nothrow_move_constructible <T>声明包装类型X <T> noexcept的move构造函数?

出现错误“无法将构造函数实例化为预期的类型;找到了:(T1,T2)必需:List [(Char,Int)]”

冲突重载:公共构造函数 ApiSuccessResponse<T>(body: T)

为什么没有ArrayList(T [] t)构造函数?

Box <T>和RefCell <T>构造函数之间的行为差异

使用Seq [T]构造函数时会创建什么具体的数据类型?

在Scala中用于类型构造函数的F [_]和F [T]之间的差异

Julia中的参数化复合类型内部构造函数:为什么“ where {T}”是必需的?

`type Constructor <T> = Function&{prototype:T}`如何应用于TypeScript中的Abstract构造函数类型?

C ++-通过enable_if_t推导参数包(可变模板)构造函数和复制构造函数

pthread_t 在类的构造函数中的生命周期

ARRAY [T,SIZE]适当的默认构造函数可用

实验性的::可选的nullopt_t构造函数