Fortran的PURE函数能否使用全局参数?

4

在使用函数式编程的人看来,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 concurrent循环中调用吗?

我无法看出在函数式编程的上下文中纯函数的哪个特性不受 Fortran 的“pure”函数执行的限制。引用完整性?_检查_。没有副作用?_检查_。 - Rodrigo Rodrigues
@RodrigoRodrigues,Fortran的“纯函数”可以根据外部状态具有返回值。 - francescalus
在这个例子中,除非地球变平了或圆周率改变,否则这些变量看起来像是常数。 - Holmz
2个回答

5
如果Fortran过程(函数或子程序)在其定义中具有“pure”前缀,则从Fortran的角度来看,它是一个纯过程。 它可以用于存在纯度限制的地方。 带有前缀“elemental”且没有前缀“impure”的过程也是纯的。
为了允许指定为纯过程,该过程受到一些限制,但编译器在给出“pure”时必须诊断任何违反这些限制的情况。
没有约束条件禁止引用来自另一个模块(或其他作用域)的命名常量。
作为Fortran中纯度的动机,标准(F2008,Note 12.49)提供:
引用命名常量不是修改在过程外可见的数据。

4
根据此文档,只要全局变量是一个参数(因此其值不会改变),则可以使用它。

纯过程的执行部分和内部子程序部分不能引用带有INTENT(IN)的虚拟参数、全局变量(或任何与之存储关联的对象)或其任何子对象,在可能导致其值发生更改的上下文中:也就是在产生副作用的上下文中。


2
这个答案中的“只要……”部分是错误的。引用的东西不一定要是参数。 - IanH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接