Functional programming Erlang如何同时支持单赋值和动态类型?

Functional programming Erlang如何同时支持单赋值和动态类型?,functional-programming,erlang,variable-assignment,dynamic-typing,Functional Programming,Erlang,Variable Assignment,Dynamic Typing,让我开始说,我只是一个计算机科学爱好者,对这门学科的知识相对较少。我的问题是:如果单赋值是指一个变量(例如,a)只能被赋值一个值,而该值不能改变(a=1,a=2->error),那么一种语言怎么也可以有动态输入呢?如果变量的值不能更改,那么它肯定不能更改其类型。。。对吗?动态键入与分配无关。Erlang在编译时不执行类型检查,但在运行时执行 比方说,我有一些功能: foo() -> %% Perform some computation Result. bar(Arg) ->

让我开始说,我只是一个计算机科学爱好者,对这门学科的知识相对较少。我的问题是:如果单赋值是指一个变量(例如,
a
)只能被赋值一个值,而该值不能改变(
a=1
a=2
->
error
),那么一种语言怎么也可以有动态输入呢?如果变量的值不能更改,那么它肯定不能更改其类型。。。对吗?

动态键入与分配无关。Erlang在编译时不执行类型检查,但在运行时执行

比方说,我有一些功能:

foo() ->
  %% Perform some computation
  Result.
bar(Arg) ->
  %% Some computation
  Result.
哪种类型会有函数结果?我现在不知道。二郎也是。接下来,假设我有另一个函数:

foo() ->
  %% Perform some computation
  Result.
bar(Arg) ->
  %% Some computation
  Result.

哪些类型可以作为此函数的参数传递?同样,此决定将仅在运行时作出。

动态键入与分配无关。Erlang在编译时不执行类型检查,但在运行时执行

比方说,我有一些功能:

foo() ->
  %% Perform some computation
  Result.
bar(Arg) ->
  %% Some computation
  Result.
哪种类型会有函数结果?我现在不知道。二郎也是。接下来,假设我有另一个函数:

foo() ->
  %% Perform some computation
  Result.
bar(Arg) ->
  %% Some computation
  Result.

哪些类型可以作为此函数的参数传递?同样,只有在运行时才会做出此决定。

如果一种语言是动态类型的,这意味着通常不可能在不运行程序的情况下确定任何给定表达式的类型。这并不意味着变量必须能够改变它们的类型,只是在不运行程序的情况下不可能判断变量的类型

以这段代码为例:

A =
    if some_condition -> 42;
    true -> "hello"
    end

在这里,如果不知道条件是真是假,我们就无法知道A是数字还是字符串(如果不运行代码,我们通常无法知道,因为它可能是一个任意复杂的表达式)。在静态类型语言中,上述内容是非法的,但在Erlang中是允许的。

如果语言是动态类型的,这意味着通常不可能在不运行程序的情况下确定任何给定表达式的类型。这并不意味着变量必须能够改变它们的类型,只是在不运行程序的情况下不可能判断变量的类型

以这段代码为例:

A =
    if some_condition -> 42;
    true -> "hello"
    end

在这里,如果不知道条件是真是假,我们就无法知道A是数字还是字符串(如果不运行代码,我们通常无法知道,因为它可能是一个任意复杂的表达式)。在静态类型语言中,上述内容是非法的,但在Erlang中是允许的。

您处理的是两个非常不同的概念。动态类型意味着程序的类型安全性是在运行时确定的,而静态类型则在编译时确定

一个有用的过度简化可能是,静态类型语言的构造使得类型安全性(或正确性)可以通过检查用该语言编写的程序的文本来确定。动态类型化语言没有这样的语言特性/构造,而是在运行时发现类型安全性。就像所有的计算机科学一样,与其他类型的系统相比,一种类型的系统代表了赞成和反对的权衡

另一方面,单个赋值与类型无关。它只是意味着一个变量只能被赋值一次

假设你有一个函数F(),如果我们说

X = F(),
Y = X ++ "I hope F returned a string",
Y = "This cannot work in a single-assignment language".
静态类型化语言将能够在编译时推断字符串连接的类型安全性,而动态类型化语言(可能)在运行时之前无法做出此确定


Erlang是单赋值的事实意味着,在(希望)成功的字符串串联之后,Y不能被重新赋值。

您处理的是两个非常不同的概念。动态类型意味着程序的类型安全性是在运行时确定的,而静态类型则在编译时确定

一个有用的过度简化可能是,静态类型语言的构造使得类型安全性(或正确性)可以通过检查用该语言编写的程序的文本来确定。动态类型化语言没有这样的语言特性/构造,而是在运行时发现类型安全性。就像所有的计算机科学一样,与其他类型的系统相比,一种类型的系统代表了赞成和反对的权衡

另一方面,单个赋值与类型无关。它只是意味着一个变量只能被赋值一次

假设你有一个函数F(),如果我们说

X = F(),
Y = X ++ "I hope F returned a string",
Y = "This cannot work in a single-assignment language".
静态类型化语言将能够在编译时推断字符串连接的类型安全性,而动态类型化语言(可能)在运行时之前无法做出此确定


Erlang是单赋值的事实意味着,在(希望)成功的字符串连接之后,Y不能被重新赋值。

单赋值很容易,如果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)
,编译器将不会抱怨,它将生成一个有效的beam文件,如果执行这行奇怪的代码,该文件将崩溃

对于C语言来说,这看起来像是一种回归,因为它很晚才揭示错误,而这似乎很容易被发现。但事实上,这样做有一些好处和义务,特别是对于Erlang:

  • 二郎p