在我看来,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)提供:
上述约束旨在保证纯过程没有副作用(对过程外部可见的数据的修改)
引用命名常量并不是对过程外部可见的数据的修改。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)