我了解某些语言在编程中结合了许多不同范例的元素。有人告诉我Fortran是一种功能语言的示例,但是我对它是否纯粹是功能性有些困惑,因为它似乎主要用于数学功能,但是我也读到它是可能也可以将面向对象的编程应用于Fortran,所以它是某种混合形式吗?
“我对它是否纯粹是功能有点困惑,因为它似乎主要用于数学函数”
这似乎是对术语“纯功能”的含义的误解,也可能是对术语“数学功能”的含义的误解。
A mathematical function是输入和输出之间的映射:
在数学中,函数是集合之间的一种关系,该关系与第一集合的每个元素恰好与第二集合的一个元素相关联。
在编程语言的上下文中,函数的输入是其参数,而输出是其返回值,因此例如像
这样的功能def greeting(name):
return 'Hello, ' + name
在Python中被认为是数学函数,而类似的函数
def print_square(x):
print(x ** 2)
return None
不被视为数学函数。在此请注意,该计算本质上是否为数学与该数学意义上的函数无关。 print_square
执行一些算术运算,比greeting
更像数学。但是greeting
是一个数学函数,而print_square
不是。greeting
是一个数学函数,因为它是从一组字符串到一组字符串的映射,并且可以通过将哪些输入与哪些输出相关联来描述该函数。完整写出映射将花费无数行,但是映射就像:
'Alice' → 'Hello, Alice'
'Bob' → 'Hello, Bob'
'Charles' → 'Hello, Charles'
'####' → 'Hello, ####'
'' → 'Hello, '
...
第一个集合中的每个元素(即所有字符串的集合)都与第二个集合中的一个元素恰好相关,所以greeting
满足数学函数的定义。
相反,print_square
不是数学函数,因为不能用从输入到输出的映射来描述它:
12 → None
4 → None
...
这些映射(从整数组到{None}
组的映射没有正确定义print_square
的功能,这是因为它计算输入和prints it to the console的平方。
为了避免与“做一些数学运算的函数”混淆,最好使用计算术语“ pure function”:
...纯函数是数学函数的计算类似物。,Fortran主要用于进行数学computations,但这不是“数学函数”的意思。纯函数式编程因此,对于您的评论,Fortran
“似乎主要用于数学函数]
在计算机科学中,纯函数式编程通常指定一种编程范例...,它将所有计算视为对数学函数的评估。也可以通过禁止更改状态和可变数据来定义纯函数式编程。编写纯函数是不够的;此定义表示所有计算必须由纯函数来完成,语言才能被视为纯函数。Fortran是纯功能语言吗?不它不是。根据输入和输出之间的映射,Fortran中的子例程可以做其他事情,而不仅仅是返回值。 Fortran中的计算可以通过状态更改和可变数据来完成。一个例子就足够了:这个例子来自Rosetta Code。请注意,对于编程语言而言,
允许
subroutine hs(number, length, seqArray)
integer, intent(in) :: number
integer, intent(out) :: length
integer, optional, intent(inout) :: seqArray(:)
integer :: n
n = number
length = 1
if(present(seqArray)) seqArray(1) = n
do while(n /= 1)
if(mod(n,2) == 0) then
n = n / 2
else
n = n * 3 + 1
end if
length = length + 1
if(present(seqArray)) seqArray(length) = n
end do
end subroutine
变量输出,又是子例程更改数组的状态。因此,此子例程未定义纯函数,而是使用“状态改变和可变数据”,纯函数语言的定义禁止使用此子例程。因此,子例程n
显然是可变的,因为其状态在循环中发生了变化。同样,数组seqArray
是可变的,它既是子例程的输入和
hs
实际上没有定义“数学函数”,即使其执行的计算实际上是mathematical。命令式编程
...一种编程范例,它使用更改程序状态的语句。 ...命令式程序由计算机执行的命令组成。上面显示的Fortran子例程符合这两个定义:它使用语句或命令来更改计算机执行的程序状态。因此,Fortran是命令式编程语言。
请注意,与Wikipedia的“纯功能”定义不同,即使不以这种方式进行
全部计算
,语言也可能是必须的。因此,尽管在Fortran中编写纯函数(通过更改程序的状态无法正常工作)是[[possible,但是Fortran势在必行。也许不是“绝对必要”。““什么”与“如何”人们常说命令式程序是说“应该”完成计算的程序,而声明式程序只说“应该做什么”。甚至维基百科says so:
即时编程着重于描述程序的[[如何
操作。该术语通常与声明性编程相反,声明性编程侧重于程序应完成的[[what而未指定how程序应达到的结果。
那么,Fortran代码是描述程序应如何“执行”某事或应完成“什么”?
[C0之类的语句是告诉计算机执行某项操作的命令;在计算机执行命令之前有一个程序状态,此后又有一个不同的程序状态。语句n = n / 2
还告诉计算机“如何”执行命令:将n = n / 2
的当前值除以2,然后将结果存储在变量n
中。因此,根据“如何” /“什么”的区别,Fortran是命令性的,而不是声明性的。
n
表示我们想要实现的目标;一个新的程序状态,其中n = n / 2
保持旧状态的值除以2。然后您会说对了,它的确如此,至少对于阅读它的人而言。这表明,“如何” /“什么”的区分太模糊,以至于不能用作定义来确定一种语言是命令式还是声明式的定义。这只是这些范例之间的松散描述对比,而不是任何一个范例的定义。要确定一种语言是强制性语言还是纯功能性语言,还是其他任何范式,您应该参考该范式的可服务定义。