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

问题描述 投票:5回答:2

在我看来,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和earthEquatorialRadius,但这是不可取的,因为我想在其他函数和子例程中使用它们。在每个函数或过程中定义dp类型会更加繁琐。

因此,从Fortran的角度来看,一个函数使用在函数之外定义的全局参数仍然被认为是纯粹的并且可以从do并发循环调用吗?

fortran gfortran intel-fortran
2个回答
5
投票

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

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


4
投票

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

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

没有约束来自另一个模块(或其他范围)的命名常量可能不被引用。

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.