haskell - 单位情况下如何理解米田的基数?
问题描述
请注意,这不是严格意义上的haskell问题,但这就是我一直在玩这个的地方,也是我看到米田引理表达得最干净的地方......
所以,根据 yoneda 引理,我们知道
forall x . (a -> x) -> f x ~= f a
但我想知道的是,当类型 x 的基数低于 a 时,它如何工作?例如,unit...采用 f=Identity, a=Integer, x=Unit 我们得到类似
(Integer -> ()) -> Indentity () ~= Identity Int
哪个似乎没有意义?
我一直以 a=Bool 和 x=Int 的形式想到 yoneda
(Bool -> Integer) -> Identity Integer ~= Identity Bool
从某种意义上说,Identity Integer“似乎”比 Identity Bool 大,但鉴于它必须由 Bool->Integer 构建,我们知道实际上只有两个选项......但我觉得翻转它表明所说的理解不太正确。
我将不胜感激任何帮助理解这一点!
解决方案
你无法修复x ~ ()
。为了保持恒等式,该函数必须适用于 的每一个选择x
,而不仅仅是一个特定的选择。这就是为什么forall
在那个参数上有一个。因此,让我们重铸您的示例,保留参数超过x
. 我给你一个以下类型的函数
(Integer -> x) -> Identity x
承诺它适用于x
您选择的任何产品。我可能实现这个函数的唯一方法是Integer
我手里已经有了一个,然后调用你给我的函数,产生一个x
. 因此,我的函数相当于一个Identity Integer
.
同样我们可以采取a ~ Bool, f ~ []
, 屈服
(Bool -> x) -> [x]
我可以实现这一点的唯一方法是,如果我有一个[Bool]
躺着,并用我的每个Bool
s 调用你的函数。
由于必须是多态的,它没有特定的基数,因此不会出现x
小于或大于的问题。a
推荐阅读
- android - Altbeacon 未在 Android 7 上扫描
- ibm-data-replication - 从 SQL Server 上的 CDC 映射表时出现补充日志记录错误
- mongodb - 如何在聚合管道 mongodb 中使用 $update/ $set 运算符?
- git - Jenkins git插件没有设置环境变量
- php - 获取数组的最后一个不为空的元素
- javascript - 我放在文件夹中的 .png 文件没有出现在我的包中
- javascript - 复制此功能是否有理由使其运行得更快?
- javascript - 过滤分配给用户的待办事项(隐藏和显示)
- java - 尝试向电子邮件地址列表(电子邮件 ID 无效)发送邮件时出错
- python-3.x - 无法完全安装和导入 Modin 包