gpt4 book ai didi

static-typing - 您知道动态类型语言中优雅解决方案的任何示例吗?

转载 作者:行者123 更新时间:2023-12-04 15:37:38 25 4
gpt4 key购买 nike

想象一下两种语言(除了类型信息)确实具有完全相同的语法,但一种是静态类型的,而另一种使用动态类型。然后,对于用静态类型语言编写的每个程序,可以通过删除所有类型信息来派生出等效的动态类型程序。由于反过来这不一定是可能的,因此动态类型程序的类严格大于静态类型程序的类。让我们称之为动态类型程序,因为它没有变量到类型的映射,使它们静态类型为“真正的动态类型程序”。

由于这两个语言家族都是图灵完备的,我们可以肯定,对于每个这样真正的动态类型程序,都存在一个静态类型程序做完全相同的事情,但我经常读到“有经验的程序员能够在动态类型语言”。因此,我问自己:有没有真正的动态类型程序的好例子,对于这些程序,任何等效的静态类型程序显然要复杂得多/不那么“优雅”(无论这意味着什么)?

你知道任何这样的例子吗?

最佳答案

我敢肯定,对于静态语言的许多“优雅”问题,静态类型检查本身不是罪魁祸首,而是语言中实现的静态类型系统缺乏表现力以及编译器的有限功能。如果这样做“更正确”(例如在 Haskell 中),那么程序会突然变得简洁、优雅……而且比它们的动态对应程序更安全。

这是一个说明(特定于 C++,抱歉):C++ 非常强大,它使用模板类系统实现了元语言。但是,仍然很难声明一个非常简单的函数:

template<class X,class Y>
? max(X x, Y y)

可能的解决方案数量惊人,例如 ?= boost::variant<X,Y>或计算?= is_convertible(X,Y)?(X:is_convertible(Y,X):Y:error) ,没有一个真正令人满意。

但是现在想象一个预处理器,它可以将输入程序转换为等效的延续传递样式形式,其中每个延续都是一个可调用对象,它接受所有可能的参数类型。 max 的 CPS 版本如下所示:
template<class X, class Y, class C>
void cps_max(X x, Y y, C cont) // cont is a object which can be called with X or Y
{
if (x>y) cont(x); else cont(y);
}

问题消失了,max 调用了一个接受 X 或 Y 的延续。所以,有一个使用静态类型检查的 max 的解决方案,但我们不能用它的非 CPS 形式表达 max, untransform(cps_max)是未定义的,可以这么说。所以,我们有一些论点 max可以做得对,但我们没有办法这样做。这是缺乏表现力。

2501 更新:
假设有一些不相关的类型 X 和 Y 并且有一个 bool operator<(X,Y) .应该怎么做 max(X,Y)返回?让我们进一步假设,X 和 Y 都有一个成员函数 foo(); .我们怎样才能写出:
void f(X x, Y y) {
max(X,Y).foo();
}

返回 X 或 Y 并对结果调用 foo() 对动态语言没有问题,但对于大多数静态语言几乎不可能。但是,我们可以通过重写 f() 来使用 cps_max 来实现预期的功能:
struct call_foo { template<class T> void operator(const T &t) const { t.foo(); } };

void f(X x, Y y) {
cps_max(x,y,call_foo());
}

所以这对于静态类型检查来说不是问题,但它看起来非常难看,并且不能很好地扩展到简单示例之外。因此,这种静态语言缺少什么,我们无法提供静态且可读的解决方案。

关于static-typing - 您知道动态类型语言中优雅解决方案的任何示例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3317770/

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