静态类型化和动态类型化在堆栈溢出(例如 )上被反复询问。
协商一致意见似乎是(引用上述链接的最高答复):
如果在编译时知道变量的类型,则会静态地输入语言。
一种动态的语言:
如果类型与运行时值相关联,而不是命名变量/字段/等,则该语言是动态键入的。
Perl似乎是静态类型的(或其他静态/动态类型的常见定义)。它有3种类型:标量、数组、散列(为了简单起见忽略引用之类的东西)。类型与变量一起声明:
my $x = 10; # declares a scalar variable named x
my @y = (1, 2, 3);
例如,在Ada中类似这样的东西(如果它支持这一点):
type Type_Name is range bottom .. top;
其中"bottom“和"top”是变量。
或者像这样的C语言(如果它支持这一点):
struct s {
int a;
if (z<3) {
char b;
int c;
} else {
struct ss {
int b;
char c;
}
}
} v;
或者,如果c在声明中的变量标识符后面有类
在scala和其他一些语言(Haskell,SML)中,我们可以使用模式匹配,例如:
val user: Option[User] = findUser(123)
user match {
case Some(u) => ...
case _ => ...
}
关于模式匹配与类型系统的关系,我有几个问题:
“静态类型系统”是否必须支持模式匹配?
是否有“动态类型系统”语言支持模式匹配?
更新:
感谢@Eran的回答。
我知道有很多语言不支持模式匹配,比如c/c++/java/python/ruby/javascript/lisp (我可以在这个列表
接口和类Number1,后来的Number2等等。当我尝试在方法add()中使用成员数据时,它要求我首先将它转换为类类型。但是,如果我在方法add()中使用成员方法,它并不要求我转换为类类型。如有任何解释,将不胜感激。
下面的代码附后。
package mynums;
//Interface for all my number types, Number1, Number2 (not shown), etc
public interface NumberIF
{
public int getNum();
public void setNum(int numx);
abstract type Elf end
struct LightElf <: Elf
name::String
life::Int32
end
struct DarkElf <: Elf
name::String
life::Int32
# This attribute is only in DarkElf.
enchantment::Int32
end
amber = LightElf("Amber",100)
charles = DarkElf("Charles",20,45)
e