你在哪里受益于动态打字?

Dha*_*ana 13 dynamic-typing

您是否经常以一种在静态类型语言中真正不可行的方式利用动态类型?

我感兴趣的是,在现实世界(而不是演示)代码中使用它们的频率是多少?

小智 8

说实话:大多数有益于动态语言(注意我说的是"动态语言",而不是"动态类型语言")提供与动态类型本身没有任何关系(而Python是我最喜欢的语言!).他们只受到如此多的关注,因为大多数静态类型的语言在灵活性方面都很难.Haskell经常在涉及这个主题时指出 - 有一个原因.在实践中,我发现静态但富有表现力(例如固有的通用)和动态类型系统之间的区别很小.

通常与动态类型相关的主要好处是广泛的多态性/ duck typing/generic programmming.例如,如果有人出现并将其传递给不同类型的东西,那么我的大多数Python代码都能正常工作,只要它具有我的代码使用的字段/方法(假设它们大致相同).基本上,它为我们节省了创建尽可能简约的接口的麻烦,并在我们可能希望传递给该特定函数的每个类中显式实现.好处应该是不言而喻的.

如上所述,这与静态/动态类型无关(这种结构类型的东西可以归结为鸭子打字,在编译时进行更广泛的编译检查).然而,在实践中这两者是相辅相成的,因为没有静态类型的主流语言与结构类型(ML/Ocaml/Haskell/...不是主流,而Go还有很长的路要走)可能的例外C++模板(与例如Haskell相比,这是无限的痛苦).


Gia*_*ian 2

理论上,您基本上可以在大多数静态类型语言中“模拟”动态类型,方法是在某种标记联合中对值进行编码,并使所有操作根据输入“类型”(实际上是输入值)正确运行。当然,然后您必须引入一堆运行时错误行为,这些行为在您遇到对这些值的无意义操作时会发生。

大多数非常非常困难的事情要么有风险,要么就是不正确的。由于反射编码更自然,许多大规模元编程在动态类型语言中要容易得多,而无需实例化高阶类型。

但是,为了回答您的问题,我认为动态类型没有任何方式提供在合理的静态类型语言中无法实现的功能。