Functional programming Fortran是纯函数语言吗?

Functional programming Fortran是纯函数语言吗?,functional-programming,fortran,programming-languages,fortran90,paradigms,Functional Programming,Fortran,Programming Languages,Fortran90,Paradigms,我知道有些语言结合了编程中许多不同范例的元素。有人告诉我Fortran是函数式语言的一个例子,但是我只是有点困惑它是否是纯函数式的,因为它似乎主要用于数学函数,但是我也了解到,也可以将面向对象编程应用到Fortran,所以它是某种混合体吗?“我只是有点困惑它是否是纯函数,因为它似乎主要用于数学函数” 这似乎是对“纯函数”一词含义的误解,也可能是对“数学函数”一词含义的误解 数学函数 A是输入和输出之间的映射: 在数学中,函数是集合之间的一种关系,它与第一个集合中的每一个元素关联,而与第二个集合中

我知道有些语言结合了编程中许多不同范例的元素。有人告诉我Fortran是函数式语言的一个例子,但是我只是有点困惑它是否是纯函数式的,因为它似乎主要用于数学函数,但是我也了解到,也可以将面向对象编程应用到Fortran,所以它是某种混合体吗?

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

这似乎是对“纯函数”一词含义的误解,也可能是对“数学函数”一词含义的误解

数学函数 A是输入和输出之间的映射:

在数学中,函数是集合之间的一种关系,它与第一个集合中的每一个元素关联,而与第二个集合中的一个元素关联

在编程语言的上下文中,函数的输入是它的参数,输出是它的返回值,例如

def问候语(名称):
返回“你好,”+name
在Python中,被认为是一个数学函数,而

def打印方格(x):
打印(x**2)
一无所获
不被视为数学函数。请注意,计算在本质上是否是数学函数与它是否是数学意义上的函数无关;
print\u square
做一些算术,这比
greeting
做的更像数学。但是
greeting
是一个数学问题函数和
print_square
不可用

问候语
是一个数学函数,因为它是一个从字符串集到字符串集的映射,函数可以通过什么输入与什么输出相关联来描述。完整写出映射需要无限多行,但映射如下:

“爱丽丝”→ '你好,爱丽丝的家人
“鲍勃”→ '你好,鲍勃的家人
“查尔斯”→ '你好,查尔斯的家人
'####'    → '你好,######
''        → '你好,'
...
第一个集合中的每个元素(即所有字符串的集合)与第二个集合中的一个元素关联,因此
问候语
符合数学函数的定义

相反,
print_square
不是一个数学函数,因为它不能通过从输入到输出的映射来描述:

12→ 没有一个
4.→ 没有一个
...
这些映射(从整数集到集
{None}
)没有正确定义
打印平方
的作用,即它计算输入和输出的平方

为了避免与“数学函数”混淆,最好使用计算术语“”:

…纯函数是数学函数的计算模拟

为了回应你的评论,Fortran“似乎主要用于数学函数”,Fortran主要用于数学计算,但这不是“数学函数”的意思

纯函数式编程 编程语言是一种所有计算都由纯函数完成的语言:

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

请注意,编程语言仅允许您编写纯函数是不够的;该定义指出,所有计算都必须由纯函数完成,才能将该语言定义为纯函数

Fortran是一种纯粹的函数式语言吗?不,不是。Fortran中的子程序可以根据输入和输出之间的映射来执行返回值以外的操作;Fortran中的计算可以通过状态更改和可变数据来完成。一个例子就够了:这个例子来自

变量
n
显然是可变的,因为它的状态在一个循环中发生了变化。此外,数组
seqArray
也是可变的,它既是子例程的输入,也是子例程的输出,子例程改变数组的状态。因此该子例程不定义纯函数,它使用“改变状态和可变数据”“,这是纯函数式语言定义所禁止的

因此,子例程
hs
不定义“数学函数”,即使它执行的计算是本质上的

命令式编程 是:

。。。使用改变程序状态的语句的编程范例。。。命令式程序由计算机执行的命令组成

上面显示的Fortran子例程满足这两个定义:它使用语句或命令来更改计算机执行的程序状态。所以Fortran是一种命令式编程语言

请注意,与Wikipedia对“纯功能性”的定义不同,一种语言可以是强制性的,即使它不以这种方式进行所有计算。因此,虽然可以用Fortran编写纯函数,但通过改变程序的状态,Fortran是必不可少的;只是也许不是“纯粹的强制性”

“什么”与“如何” “这意味着fortran只描述“如何”做某事,而不描述“它试图做什么?”

人们常说,命令式程序是一个说明“如何”进行计算的程序,而声明式程序只说明“应该做什么”。甚至维基百科:

命令式编程侧重于描述程序如何运行

这个术语通常与声明式编程相对照,声明式编程关注的是程序在没有您的情况下应该完成什么
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