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

时间:2018-11-30 10:50:17

标签: 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
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的角度来看,是一个使用在函数外部定义的全局参数的函数仍被视为纯函数,可以从并发循环中调用它吗?

2 个答案:

答案 0 :(得分:5)

this documentation开始,只要它是parameter,就可以使用全局变量(因此值不会改变)。

  

纯过程的execution_part和internal_subprogram_part   不能使用INTENT(IN)(全局变量)引用虚拟参数   (或与之关联的任何存储对象),或任何子对象   在可能导致其价值发生变化的环境中:   产生副作用的环境。

答案 1 :(得分:4)

如果Fortran过程(函数或子例程)在其定义中具有pure前缀,那么就Fortran使用它而言,它是一个纯过程。然后可以在纯度受限的地方使用。带有前缀elemental而没有前缀impure的过程也是纯的。

要允许将其指定为纯格式,该过程受到许多约束,但是当给出pure时,编译器必须诊断出是否违反了这些约束。

没有任何约束可以禁止引用来自另一个模块(或其他作用域)的命名常量。

作为Fortran中纯度的动力,该标准(F2008,注释12.49)提供:

  

上述限制旨在确保纯过程没有副作用(在过程外部可见的数据修改)

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