Fortran纯函数可以使用全局参数吗?
在我看来,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
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发生变化,否则这些变量似乎是常量。此答案的“只要…”部分是错误的。引用的对象不需要是参数。