让我开始说我只是一名计算机科学爱好者,对这个问题知之甚少。我的问题是:如果单一赋值是一个变量(例如,A
)只能被分配一个值而没有要更改的值的想法(A = 1
,{{ 1}} - > A = 2
)一种语言如何进行动态输入?如果变量的值不能改变,肯定它不能改变它的类型......对吗?
答案 0 :(得分:4)
如果语言是动态类型的,则意味着通常无法在不运行程序的情况下确定任何给定表达式的类型。这并不意味着变量必须能够改变它们的类型,只是在不运行程序的情况下无法判断变量的类型。
所以以这段代码为例:
A =
if some_condition -> 42;
true -> "hello"
end
这里我们不知道A是一个数字还是一个字符串而不知道条件是真还是假(我们通常不知道如果没有运行代码,因为它可能是一个任意复杂的表达式)。在静态类型语言中,上述内容是非法的,但在Erlang中是允许的。
答案 1 :(得分:2)
动态类型与分配无关。 Erlang在编译时不执行类型cheks,但是在运行时执行它。
我想说,我有一些功能:
foo() ->
%% Perform some computation
Result.
哪种类型会有功能效果?我不知道。 Erlang也是。接下来,让我说,我有另一个功能:
bar(Arg) ->
%% Some computation
Result.
我可以传递哪些类型作为此函数的参数?同样,这个决定只会在运行时进行。
答案 2 :(得分:2)
您正在处理两个截然不同的概念。动态类型化意味着程序的类型安全性是在运行时确定的,而静态类型则是在编译时执行相同的操作。
有用的过度简化可能是构造静态类型语言,以便通过检查用该语言编写的程序文本来确定类型安全性(或正确性)。动态类型语言没有语言特性/结构,因此这是可能的,而是在运行时发现类型安全性。像计算机科学一样,一种类型系统代表了与其他类型系统相比的专业和骗局的权衡。
另一方面,单一任务对类型没有任何说明。它只是意味着变量只能赋值一次。
如果我们说
,假设你有一个函数F()X = F(),
Y = X ++ "I hope F returned a string",
Y = "This cannot work in a single-assignment language".
静态类型语言能够在编译时推断字符串连接的类型安全性,而动态类型语言(可能)直到运行时才能进行此确定。
Erlang是单一赋值这一事实意味着在(希望)成功的字符串连接之后,Y无法重新分配其他值。
答案 3 :(得分:0)
单个赋值很容易,如果A绑定为1(反之,我不知道如何使用此动词:o)任何其他赋值都将失败并创建异常
1> A = 1.
1
2> A = 1.0.
** exception error: no match of right hand side value 1.0
3> %% even strongly typed!
动态类型是一个不同的概念,它意味着在运行时检查变量的类型,而不是在编译时。例如,如果我们使用像lists:reverse(A)
这样的变量在列表上工作的函数,编译器就不会抱怨,并且它会生成一个有效的梁文件,如果执行了这个奇怪的代码行,它将崩溃。
来自C,这看起来像是对我的回归,因为它很容易发现错误,当它似乎很容易被发现时。但事实上,这样做有一些优点和义务,特别是对于Erlang: