gpt4 book ai didi

haskell - 显示 `newtype T a = T (a -> Int)` 是一个不是仿函数的类型构造函数

转载 作者:行者123 更新时间:2023-12-03 15:10:01 25 4
gpt4 key购买 nike

据称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)

为了 super 迂腐,你可以重命名 gaToB , 和 fbToInt .
instance Contravariant T where
contramap aToB (T bToInt) = T (bToInt . aToB)

可以写 Contravariant的原因 T a 的实例归结为 aT (a -> Int) 中处于逆变位置.说服自己的最佳方式 T a不是 Functor是尝试(但失败)写 Functor自己举例。

关于haskell - 显示 `newtype T a = T (a -> Int)` 是一个不是仿函数的类型构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44103758/

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