当前位置: 首页 > 知识库问答 >
问题:

存在类型的理论基础是什么?

许淳
2023-03-14
data S = forall a. Show a => S a      -- (1)

为可以转换为字符串的东西定义类型包装。wiki提到,我们真正想要定义的是一种类型,比如

data S = S (exists a. Show a => a)    -- (2)

即一个真正的“存在”类型--我松散地认为这是说“数据构造函数s接受show实例存在的任何类型并包装它”。实际上,您可以编写一个GADT,如下所示:

data S where                          -- (3)
    S :: Show a => a -> S

我没有试过编译它,但它似乎应该可以工作。对我来说,GADT显然等同于我们想要编写的代码(2)。

¬(∀x. px) ⇔ ∃x. ¬(px)

共有1个答案

朱风史
2023-03-14

首先,看一看“库里霍华德对应关系”,它指出计算机程序中的类型对应于直觉逻辑中的公式。直觉逻辑就像你在学校里学的但没有排中律或双否定排除律的“规律性”逻辑:

>

  • 不是公理:P,P(但P,P很好)

    不是公理:P≠P

      null

    我们可以导出(公牛x.P Q(x)) = P(公牛x.Q(x)):

    1. (运行参数x.P Q(x))
    2. (dx.píQ(x))
    3. ,pø(uncx.Q(x))
    4. P(运行参数Q)

    和(unx.Q(x)P) = (x.Q(x))P(下面使用这个):

      null
    data T = Con Int | Nil
    
    Con :: Int -> T
    Nil :: T
    
    unCon :: T -> Int
    unCon (Con x) = x
    
    data T a = Con a | Nil
    

    这将创建两个构造函数,

    Con :: a -> T a
    Nil :: T a
    

    当然,在Haskell中,类型变量是隐式通用量化的,因此这些实际上是:

    Con :: ∀a. a -> T a
    Nil :: ∀a. T a
    

    而访问者也同样容易:

    unCon :: ∀a. T a -> a
    unCon (Con x) = x
    
    Con :: (∃x. t) -> T
    unCon :: T -> (∃x. t)
    
    Con :: ∀x. t -> T
    
    data T = Con (exists x. t) | Nil
    data T = forall x. Con t | Nil
    

    只是在Haskell中没有exists的语法。

    在非直觉逻辑中,允许从uncon类型导出以下内容:

    unCon :: ∃ T -> t -- invalid!
    

    这是无效的原因是这样的转换在直觉逻辑中是不允许的。因此,在没有exists关键字的情况下,不可能为uncon编写类型,也不可能将类型签名设置为prenex形式。很难保证类型检查器在这种情况下终止,这就是Haskell不支持任意存在量词的原因。

  •  类似资料:
    • 前言 最近有人在 Twisted 邮件列表中提出诸如 为任务紧急的人提供一份 Twisted 介绍 的需求。值得提前透露的是,这个系列并不会如他们所愿。尤其是介绍 Twisted 框架和基于 Python 的异步编程而言,可能短时间无法讲清楚。因此,如果你时间紧急,这恐怕不是你想找的资料。 我相信如果对异步编程模型一无所知,快速的介绍同样无法让你对其有所理解,至少你得稍微懂点基础知识吧。我已经用T

    • 本章介绍计算机网络基础理论。 TCP-IP网络模型 ARP ICMP 路由 交换机 UDP DHCP-DNS TCP VLAN Overlay

    • 为了让程序有价值,我们需要能够处理最简单的数据单元:数字,字符串,结构体,布尔值等。 TypeScript支持与JavaScript几乎相同的数据类型,此外还提供了实用的枚举类型方便我们使用。 最基本的数据类型就是简单的true/false值,在JavaScript和TypeScript里叫做boolean(其它语言中也一样)。 let isDone: boolean = false; 和Java

    • 新建我们的person.ts,我们通过这一个文件,使用所有的基础类型。 实验 实验一 代码 enum Choose { Wife = 1, Mother = 2} // 选择 妻子 还是 妈妈 function question(choose: Choose) : void{ console.log('你老婆和你妈妈同时掉进水里你先救哪个?'); console.log('你的选

    • 技术名称 支持者 支持方式 网络虚拟化方式 数据新增报文长度 链路HASH能力 VXLAN Cisco/VMWARE/Citrix/Red Hat/Broadcom L2 over UDP VXLAN报头 24 bit VNI 50Byte(+原数据) 现有网络可进行L2 ~ L4 HASH NVGRE HP/Microsoft/Broadcom/Dell/Intel L2 over GRE NV

    • LAN 表示 Local Area Network,本地局域网,通常使用 Hub 和 Switch 来连接 LAN 中的计算机。 一个 LAN 表示一个广播域,它的意思是 LAN 中的所有成员都会收到 LAN 中一个成员发出的广播包。 因此,LAN 的边界在路由器或者类似的三层设备。 VLAN 表示 Virtual LAN。一个带有 VLAN 功能的 Switch 能够同时处于多个 LAN 中。简