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

标签 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

函数 sphericalArc 没有副作用,因此从这个意义上来说它是纯粹的,但它使用全局常量。确实,参数 PI 和 EarthEquatorialRadius 可以在函数内部定义,但这是不可取的,因为我想在其他函数和子例程中使用它们。在每个函数或过程中定义 dp 类型会更加繁琐。

那么从 Fortran 的角度来看,使用在函数外部定义的全局参数的函数仍然被认为是纯函数并且可以从 do 并发循环中调用吗?

最佳答案

如果 Fortran 过程(函数或子例程)具有 pure如果在其定义中添加前缀,则从 Fortran 使用它的意义上来说,它是一个纯过程。然后可以将其用于纯度有限制的地方。带有前缀 elemental 的过程并且没有前缀 impure也是纯净的。

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

不存在不能引用来自另一个模块(或其他作用域)的命名常量的限制。

作为 Fortran 纯洁性的动机,标准(F2008,注释 12.49)提供:

The above constraints are designed to guarantee that a pure procedure is free from side effects (modifications of data visible outside the procedure)

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

关于fortran - Fortran PURE 函数可以使用全局参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53556047/

相关文章:

fortran - 使用 ifort 重载派生类型的加法时为 "Operation is invalid"

linux - 是否可以在 ifort 中启用舍入为零或舍入为负无穷大?

fortran - 如何调用模块中子程序内部的函数?

Fortran 编译错误 - undefined reference

fortran - 在对两个数组的乘积求和时,gfortran 或 ifort 编译器会明智地使用 SIMD 指令吗?

makefile - 使用 make 将目标文件存储在单独的目录中

c - Fortran/C 互操作性将结构从 Fortran 传递到带有可分配项的 C

visual-studio - QR分解Fortran错误

c - 将递归 C 结构移植到 Fortran

string - 在Fortran中读取带空格的字符串