在思考了这个问题一段时间之后,我发现静态鸭式语言可能确实有效.为什么在编译时不能将预定义的类绑定到接口?例:
public interface IMyInterface
{
public void MyMethod();
}
public class MyClass //Does not explicitly implement IMyInterface
{
public void MyMethod() //But contains a compatible method definition
{
Console.WriteLine("Hello, world!");
}
}
...
public void CallMyMethod(IMyInterface m)
{
m.MyMethod();
}
...
MyClass obj = new MyClass();
CallMyMethod(obj); // Automatically recognize that MyClass "fits"
// MyInterface, and force a type-cast.
Run Code Online (Sandbox Code Playgroud)
你知道支持这种功能的任何语言吗?它会在Java或C#中有用吗?它在某种程度上存在根本缺陷吗?我知道你可以继承MyClass并实现接口或使用Adapter设计模式来完成同样的事情,但这些方法看似不必要的样板代码.
在阅读了这个非常有用的信息(尽管有点争论性)之后,我想了解您使用Python编写大型项目的经验.随着项目变得更大,事情变得无法管理吗?这种担忧是让我依赖Java的一件事.因此,我会特别感兴趣的知情对于大型项目的可维护性和Java和Python的可扩展性的比较.
有什么方法可以在 Julia 中明确要求(例如在模块或包中)必须声明类型 ?例如或是否支持此类检查?更广泛地说,Julia 标准发行版本身是否提供任何可以帮助检查此要求的静态代码分析器或等效物? PackageCompilerLint.jl
作为一个激励示例,假设我们希望确保不断增长的生产代码库只接受始终声明为类型的代码,前提是具有类型声明的大型代码库往往更易于维护。
如果我们想强制执行该条件,Julia 在其标准发行版中是否提供任何机制来要求类型声明或帮助推进该目标?(例如,任何可以通过短绒、提交钩子或等价物检查的东西?)
我正在寻找一个在编译时进行类型检查的Lua前端编译器,但输出标准的Lua 5.1字节代码(只有运行时类型).我想要的是一定量的静态,编译时语法分析和可选类型,以便比运行时更快地检测到琐碎的错误.生成的字节代码必须与使用标准LoadString()编译的现有Lua字节代码很好地配合.
要清楚 - 任何差异只会发生在字节编译时.在运行时,字节代码不知道在编译阶段发生了任何不同/异常的事情.
我的想法听起来很像ActionScript; 我甚至不介意输出Lua字节代码的ActionScript编译器!
有没有人听说过这样的努力?我已经看到了一些使用MetaLua来做这件事的引用,但老实说,我不够聪明,无法做出文档的尾巴.
你能用静态类型检查(如Java)命名语言,代码是数据(如LISP)吗?我的意思是两种语言.
今天我深入研究了 Liskov 的替换原则和协方差/逆变。
我被困在以下之间的区别上:
T = TypeVar("T", bound=Union[A, B])T = TypeVar("T", A, B, covariant=True)我对#1 的理解
TypeVar('T', A, B) 和 TypeVar('T', bound=Union[A, B]) 的区别
这个答案明确指出T可以是:
Union[A, B](或任何亚型的联合A和B如Union[A, BChild])A(或 的任何子类型A)B(或 的任何子类型B)
这对我来说很有意义。
我有缺陷的理解#2
MyPy 不允许受约束的 TypeVar 是协变的?定义具有约束但协变的键值类型的通用字典
重新提及bound=Union[A, B]案例,但没有理解选项#2 的含义,A, B, covariant=True。
我试过玩弄mypy,但似乎无法弄清楚。
谁能指出这是什么意思?
我认为这意味着:
A(或 的任何子类型A)B(或 …sqlite使用作者称之为" Manifest Typing "的东西,这基本上意味着sqlite是动态类型的:如果你愿意,你可以在一个"int"列中存储一个varchar值.
这是一个有趣的设计决定,但每当我使用sqlite时,我就像标准的RDMS一样使用它,并将类型视为静态.实际上,在其他系统中设计数据库时,我甚至从未希望使用动态类型列.
那么,这个功能何时有用?有没有人在实践中找到了一个很好用的东西,用静态类型的列不能轻易完成?
我刚看了一段Groovy发明家 James Strachan 的视频,他继续热爱Scala.这让我想要了解更多关于Groovy的信息,这些信息引导我使用Groovy ++.Groovy ++是Groovy的静态类型和编译版本(显然是完全动态的).
我试图弄清楚什么是Groovy ++(0.9.1的最新版本?)与Scala(2.10的最新版本)形成鲜明对比.在活动的Groovy ++论坛没有任何关于最新版本的这是能够吸引多少信息非常最近的活动.
那么,Scala与Groovy ++有一个很好的简单比较/对比吗?我对Groovy本身不感兴趣(除了作为Groovy ++设计的基础),因为我想并排比较静态编译的功能.一个简单的优点/缺点(即权衡)列表基本上是我所寻求的,而不必进行数十到数百小时的研究和实验.
提前感谢您提供有关此对比度和比较查询的任何信息.
我正在学习函数式编程风格.在" 不要害怕Monads"中,Brian Beckman对Monad进行了精彩的介绍.他提到Monad是关于功能的组合,以解决复杂性.
Monad包括
unit将类型T转换为放大类型M(T)的函数; 和一个Bind函数,给定从T到M(U)的函数,将类型M(T)转换为另一种类型M(U).(U可以是T,但不一定是).
根据我的理解,实现monad的语言应该静态地进行类型检查.否则,在编译期间无法找到类型错误,并且不控制"复杂性".我的理解是否正确?
static-typing ×10
python ×2
class ×1
compilation ×1
covariance ×1
duck-typing ×1
groovy++ ×1
interface ×1
java ×1
julia ×1
jvm ×1
lint ×1
lisp ×1
lua ×1
monads ×1
mypy ×1
oop ×1
s-expression ×1
scala ×1
sql ×1
sqlite ×1