在我看来,对于使用函数式编程的人来说,在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
函数sphereArc没有副作用,因此从这个意义上讲它是纯正的,但是它使用了全局常量。确实可以在函数内部定义参数PI和earthEquatorialRadius,但这是不可取的,因为我想在其他函数和子例程中使用它们。在每个函数或过程中定义dp类型将更加繁琐。
因此,从Fortran的角度来看,是一个使用在函数外部定义的全局参数的函数仍被视为纯函数,可以从并发循环中调用它吗?
答案 0 :(得分:5)
从this documentation开始,只要它是parameter
,就可以使用全局变量(因此值不会改变)。
纯过程的execution_part和internal_subprogram_part 不能使用INTENT(IN)(全局变量)引用虚拟参数 (或与之关联的任何存储对象),或任何子对象 在可能导致其价值发生变化的环境中: 产生副作用的环境。
答案 1 :(得分:4)
如果Fortran过程(函数或子例程)在其定义中具有pure
前缀,那么就Fortran使用它而言,它是一个纯过程。然后可以在纯度受限的地方使用。带有前缀elemental
而没有前缀impure
的过程也是纯的。
要允许将其指定为纯格式,该过程受到许多约束,但是当给出pure
时,编译器必须诊断出是否违反了这些约束。
没有任何约束可以禁止引用来自另一个模块(或其他作用域)的命名常量。
作为Fortran中纯度的动力,该标准(F2008,注释12.49)提供:
上述限制旨在确保纯过程没有副作用(在过程外部可见的数据修改)
引用已命名的常量并不是对过程外部可见数据的修改。