gpt4 book ai didi

language-agnostic - 什么是存在类型?

转载 作者:行者123 更新时间:2023-12-01 22:58:44 26 4
gpt4 key购买 nike

我通读了维基百科文章 Existential types .由于存在运算符 (∃),我认为它们被称为存在类型。不过,我不确定这有什么意义。有什么区别

T = ∃X { X a; int f(X); }


T = ∀x { X a; int f(X); }

?

最佳答案

当有人定义了一个通用类型 ∀X他们说:你可以插入任何你想要的类型,我不需要知道任何关于类型的信息来完成我的工作,我只会不透明地将它称为 X .
当有人定义存在类型时 ∃X他们说:我会在这里使用我想要的任何类型;您不会对类型一无所知,因此您只能将其不透明地称为 X .
通用类型可让您编写以下内容:

void copy<T>(List<T> source, List<T> dest) {
...
}
copy函数不知道是什么 T实际上会,但它不需要知道。
存在类型可以让你写这样的东西:
interface VirtualMachine<B> {
B compile(String source);
void run(B bytecode);
}

// Now, if you had a list of VMs you wanted to run on the same input:
void runAllCompilers(List<∃B:VirtualMachine<B>> vms, String source) {
for (∃B:VirtualMachine<B> vm : vms) {
B bytecode = vm.compile(source);
vm.run(bytecode);
}
}
列表中的每个虚拟机实现可以有不同的字节码类型。 runAllCompilers函数不知道字节码类型是什么,但它不需要;它所做的只是中继来自 VirtualMachine.compile 的字节码至 VirtualMachine.run .
Java 类型通配符(例如: List<?> )是存在类型的一种非常有限的形式。
更新:忘了提到你可以用通用类型模拟存在类型。首先,包装您的通用类型以隐藏类型参数。其次,反转控制(这有效地交换了上述定义中的“你”和“我”部分,这是存在性和普遍性之间的主要区别)。
// A wrapper that hides the type parameter 'B'
interface VMWrapper {
void unwrap(VMHandler handler);
}

// A callback (control inversion)
interface VMHandler {
<B> void handle(VirtualMachine<B> vm);
}
现在,我们可以拥有 VMWrapper调用我们自己 VMHandler它有一个通用类型的 handle功能。净效果是一样的,我们的代码要处理 B作为不透明。
void runWithAll(List<VMWrapper> vms, final String input)
{
for (VMWrapper vm : vms) {
vm.unwrap(new VMHandler() {
public <B> void handle(VirtualMachine<B> vm) {
B bytecode = vm.compile(input);
vm.run(bytecode);
}
});
}
}
一个示例 VM 实现:
class MyVM implements VirtualMachine<byte[]>, VMWrapper {
public byte[] compile(String input) {
return null; // TODO: somehow compile the input
}
public void run(byte[] bytecode) {
// TODO: Somehow evaluate 'bytecode'
}
public void unwrap(VMHandler handler) {
handler.handle(this);
}
}

关于language-agnostic - 什么是存在类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/292274/

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