Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran纯函数可以使用全局参数吗?_Fortran_Gfortran_Intel Fortran - Fatal编程技术网

Fortran纯函数可以使用全局参数吗?

Fortran纯函数可以使用全局参数吗?,fortran,gfortran,intel-fortran,Fortran,Gfortran,Intel Fortran,在我看来,Fortran中所谓的纯函数对于那些使用函数式编程的人来说还不够纯。这是我的问题。假设我有以下代码: MODULE basics IMPLICIT NONE INTEGER, PARAMETER :: dp = kind(1.0d0) REAL(dp), PARAMETER :: PI=3.1415926535897932_dp REAL(dp), PARAMETER :: earthEquatorialRadius=6378.137_dp E

在我看来,Fortran中所谓的纯函数对于那些使用函数式编程的人来说还不够纯。这是我的问题。假设我有以下代码:

MODULE basics
  IMPLICIT NONE
  INTEGER, PARAMETER      :: dp = kind(1.0d0)
  REAL(dp), PARAMETER     :: PI=3.1415926535897932_dp
  REAL(dp), PARAMETER     :: earthEquatorialRadius=6378.137_dp
END MODULE basics

MODULE myFunctions
  USE basics
  IMPLICIT NONE

  PURE REAL(dp) FUNCTION sphericalArc(angleInRadians) 
    REAL(dp),INTENT(IN)  :: angleInRadians 

    sphericalArc= 2.0*PI*earthEquatorialRadius*angleInRadians
  END FUNCTION sphericalArc
END MODULE myFunctions
函数sphericalArc没有副作用,因此在这个意义上它是纯的,但它使用全局常量。参数PI和earthquatorialradius确实可以在函数中定义,但这是不可取的,因为我想在其他函数和子例程中使用它们。在每个函数或过程中定义dp类型将更加繁琐

所以从Fortran的角度来看,使用函数外部定义的全局参数的函数是否仍然被认为是纯函数,并且可以从do并发循环调用

从中可以使用全局变量,只要它是一个
参数
(因此值不会改变)

纯过程的执行部分和内部子程序部分 无法引用具有全局变量意图(IN)的伪参数 (或与之关联的任何存储对象)或任何子对象 因此,在可能导致其价值发生变化的环境中:即 产生副作用的环境

如果Fortran过程(函数或子例程)在其定义中有
pure
前缀,则在Fortran使用它的意义上,它是一个纯过程。然后可以在纯度受到限制的地方使用。带有前缀
elemental
且没有前缀
inpure
的程序也是纯的

为了允许被指定为纯,该过程受到许多约束,但是当给出
pure
时,编译器有必要诊断任何违反这些约束的情况

不存在不引用来自另一个模块(或其他作用域)的命名常量的约束

标准(F2008,注12.49)提供了以下内容,作为Fortran纯度的动机:

上述约束旨在确保纯程序没有副作用(程序外可见数据的修改)


引用命名常量不是对过程外部可见数据的修改。

我看不出函数编程上下文中纯函数的哪个属性不是由Fortran
pure
函数强制执行的。参照完整性?检查。没有副作用?检查。@RodrigoRodrigues,Fortran“pure”函数的返回值取决于外部状态。在本例中,除非地球变平或Pi发生变化,否则这些变量似乎是常量。此答案的“只要…”部分是错误的。引用的对象不需要是参数。