我理解什么是动态和静态类型系统,以及鸭子类型是什么。但是我不明白你怎么能有一种支持鸭子输入的静态语言。据我所知,只有动态类型的语言才能支持鸭子类型。
来自这个答案的StackOverflow解释道:"Duck类型是与静态、动态、弱或强类型完全正交的。“它给出了一个来自C++的静态类型化语言鸭子输入的例子,但我不是C++程序员,我不理解它。
我想解释一下静态语言支持鸭子输入的可能性。
发布于 2014-08-11 20:29:35
在我的经验中,它只是一种使用结构式系统静态类型的语言。它本质上应用了编译类型的“走路像鸭子,说话像鸭子”的检查,这样程序员就不需要为特定的子类型提供注释了。
当您试图将两个(或更多)库连接在一起时,这有很大的好处。对于命名类型系统,如果您在一个库中有一些接口,而另一个库中有一个对象,那么它们彼此不知道,并且不能进行子类型--即使对象满足接口的要求。结构打字就没问题了。
使语言静态只意味着编译器在编译时执行该检查,在该对象不能真正满足接口的情况下,会在早期(而且显然)出现错误。
有一些深奥的语言可以做到这一点,但大多数结构类型化语言也是动态类型化的,几乎所有的命名类型化语言也都是静态类型化的。
发布于 2014-08-11 20:33:46
这一术语的通常含义只是结构类型。
在结构类型的系统中,事物有一个静态类型。但是,该类型基于类型的实际结构,而不是任何特定的类型名称。
例如,假设我们有Python代码
def foo(bar):
bar.baz()
bar.quux(5)
现在还不清楚bar
的类型是什么,但不管我们知道什么
baz
。quux
,它接受一个整数参数。现在,在结构化类型系统中,我们可以为foo
分配一个类型
foo : forall a b. r{baz : () -> a, quux : (int) -> b} -> Void
有趣的r
意味着
任何类型的
r
方法.
许多语言实现了一些结构类型特性的子集,例如,C++通过模板实现了“结构类型”。然而,这是一种稍微特别的方法。
其他语言实现行类型。这些只是结构类型的记录/结构!在这些类型中,我们可以说“我们希望记录至少有字段.”。我相信纯文本实现了这些。
Go具有类似于结构类型的“隐式接口”。这些只是一个类型自动实现的接口。然而,这不是完全的结构类型,因为它不允许用参数处理结构类型,也就是说,没有办法说类似的话
foo :: r{a : int} -> w{a : int} -> r
foo r w = w -- Type error!!
因为一切都是“向上”到一个接口,而不是仅仅是不透明地处理。
有一些关于将这些添加到Haskell视图-XOverloadedRecordFields
中的讨论,但我不知道在结构类型方面有什么真正的进展,因为它是完全通用的。
发布于 2014-08-11 21:36:27
静态类型只意味着在编译时检查类型。编译器检查一个类型是否有一个具有特定名称和签名的方法,就像检查一个类型是特定继承层次结构的一部分一样容易。诀窍是找到一种简洁的方法来指定“此函数的参数是具有此特定名称的方法的任何类型”。
我最熟悉的方法是使用类型类,这是一个声明,它基本上说:“实现所有这些函数的任何类型都可以使用这个名称。”
通常,您必须明确声明一个类型为一个类型类的实例,但是它不必在定义类型本身的代码中,这意味着任何人都可以在事实之后将自己的类型类添加到他们不控制的类型中。这是对全鸭打字的一种妥协,更像是,“如果它像鸭子一样走路,像鸭子一样嘎嘎叫,那么任何地方的人都可以明确地宣布它是鸭子一样的东西,而其他人也可以把它当作鸭子对待。”
但是,允许将类型隐式添加到类型类并不是很大的扩展,您只是失去了一点控制。正如阿蒙和乔泽夫所指出的那样,go语言具有基本类似于隐式添加类型类的接口。
https://softwareengineering.stackexchange.com/questions/252984
复制相似问题