Fortran是纯功能语言吗?

问题描述 投票:1回答:1

我了解某些语言在编程中结合了许多不同范例的元素。有人告诉我Fortran是一种功能语言的示例,但是我对它是否纯粹是功能性有些困惑,因为它似乎主要用于数学功能,但是我也读到它是可能也可以将面向对象的编程应用于Fortran,所以它是某种混合形式吗?

functional-programming fortran programming-languages fortran90 paradigms
1个回答
3
投票

“我对它是否纯粹是功能有点困惑,因为它似乎主要用于数学函数”

这似乎是对术语“纯功能”的含义的误解,也可能是对术语“数学功能”的含义的误解。

数学函数

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

“似乎主要用于数学函数]

,Fortran主要用于进行数学computations,但这不是“数学函数”的意思。纯函数式编程

一种purely functional编程语言是一种通过纯函数来完成所有计算的语言:

在计算机科学中,纯函数式编程通常指定一种编程范例...,它将所有计算视为对数学函数的评估。也可以通过禁止更改状态和可变数据来定义纯函数式编程。

请注意,对于编程语言而言,

允许

编写纯函数是不够的;此定义表示所有计算必须由纯函数来完成,语言才能被视为纯函数。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

命令式编程

Imperative programming是:

...一种编程范例,它使用更改程序状态的语句。 ...命令式程序由计算机执行的命令组成。

上面显示的Fortran子例程符合这两个定义:它使用语句或命令来更改计算机执行的程序状态。因此,Fortran是命令式编程语言。

请注意,与Wikipedia的“纯功能”定义不同,即使不以这种方式进行

全部计算

,语言也可能是必须的。因此,尽管在Fortran中编写纯函数(通过更改程序的状态无法正常工作)是[[possible,但是Fortran势在必行。也许不是“绝对必要”。
““什么”与“如何”

“这意味着fortran仅描述了“如何”做某事,而不是“它试图做的是什么?”

人们常说命令式程序是说“应该”完成计算的程序,而声明式程序只说“应该做什么”。甚至维基百科says so

即时编程着重于描述程序的[[如何

操作。
该术语通常与声明性编程相反,声明性编程侧重于程序应完成的[[what而未指定

how程序应达到的结果。

那么,Fortran代码是描述程序应如何“执行”某事或应完成“什么”?

[C0之类的语句是告诉计算机执行某项操作的命令;在计算机执行命令之前有一个程序状态,此后又有一个不同的程序状态。语句n = n / 2还告诉计算机“如何”执行命令:将n = n / 2的当前值除以2,然后将结果存储在变量n中。因此,根据“如何” /“什么”的区别,Fortran是命令性的,而不是声明性的。

但是您可能会争论:n表示我们想要实现的目标;一个新的程序状态,其中n = n / 2保持旧状态的值除以2。然后您会说对了,它的确如此,至少对于阅读它的人而言。这表明,“如何” /“什么”的区分太模糊,以至于不能用作定义来确定一种语言是命令式还是声明式的定义。这只是这些范例之间的松散描述对比,而不是任何一个范例的定义。要确定一种语言是强制性语言还是纯功能性语言,还是其他任何范式,您应该参考该范式的可服务定义。
© www.soinside.com 2019 - 2024. All rights reserved.