gpt4 book ai didi

types - 对函数子类型感到困惑

转载 作者:行者123 更新时间:2023-12-04 03:47:11 26 4
gpt4 key购买 nike

我正在学习一门编程语言类(class),而“当一个函数是另一个函数的子类型时”的答案对我来说是非常违反直觉的。

澄清一下:假设我们具有以下类型关系:

bool<int<real

为什么函数 (real->bool)(int->bool的子类型?难道不是相反吗?

我希望子类型函数的标准是:如果f2可以接受f1可以接受的任何参数,并且f1仅返回f2返回的值,则f1是f2的子类型。显然有f1可以取值,但f2不能取值。

最佳答案

这是函数子类型化的规则:

参数类型必须是协变的,返回类型必须是协变的。

协变量==保留结果参数类型的“A是B的子类型”层次结构。

相反变量==反转(“反对”)arguments参数的类型层次结构。

因此,在您的示例中:

f1:  int  -> bool
f2: bool -> bool

我们可以安全地得出结论,f2是f1的子类型。为什么?因为(1)仅查看两个函数的参数类型,我们看到“bool是int的子类型”的类型层次实际上是协变的。它保留int和bool之间的类型层次结构。 (2)仅查看两个函数的结果类型,我们就会看到保持了逆方差。

换种说法(我对这个主题的简单英语理解):

相反的论点:“我的调用者可以传递超出我要求的值,但这没关系,因为我只会使用我需要使用的东西。”
协变量返回值:“我可以返回超出调用者要求的更多值,但这没关系,他/她将只使用他们需要的内容,而忽略其余内容”

让我们来看另一个例子,使用所有都是整数的结构:
f1:  {x,y,z} -> {x,y}
f2: {x,y} -> {x,y,z}

所以在这里,我们再次断言f2是f1的子类型(它是)。查看两个函数的参数类型(并使用<符号表示“是它的子类型”),则如果f2
查看两个函数的返回类型,如果f2 {x,y,z}是吗?答案是肯定的。 (请参见上面的逻辑)。

考虑这种情况的第三种方法是,假设f2
   F1 = f1;
F2 = f2;
{a,b} = F1({1,2,3}); // call F1 with a {x,y,z} struct of {1,2,3}; This works.
{a,b,c} = F2({1,2}); // call F2 with a {x,y} struct of {1,2}. This also works.

// Now take F2, but treat it like an F1. (Which we should be able to do,
// right? Because F2 is a subtype of F1). Now pass it in the argument type
// F1 expects. Does our assignment still work? It does.
{a,b} = ((F1) F2)({1,2,3});

关于types - 对函数子类型感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1150372/

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