你可以基本上做到這一點(同樣在Vladimir's answer中提到)定義了函子對象。它們有一個返回值的特定函數(例如getvalue()
),並且根據它們的初始化,它們可以返回自定義的函數值。
以下示例詳細說明。泛函函數的定義見functor_module
,在expfunc_module
中具體實現了對指數函數族的推導。然後,在主程序中,然後用指數中的不同前導因子初始化不同的實例,並使用它們的getvalue()
方法獲得相應的函數值。:
module functor_module
implicit none
integer, parameter :: wp = kind(1.0d0)
type, abstract :: functor
contains
procedure(getvalue_iface), deferred :: getvalue
end type functor
interface
function getvalue_iface(self, xx) result(yy)
import
class(functor), intent(in) :: self
real(wp), intent(in) :: xx
real(wp) :: yy
end function getvalue_iface
end interface
end module functor_module
module expfunc_module
use functor_module
implicit none
type, extends(functor) :: expfunc
real(wp) :: aa
contains
procedure :: getvalue
end type expfunc
contains
function getvalue(self, xx) result(yy)
class(expfunc), intent(in) :: self
real(wp), intent(in) :: xx
real(wp) :: yy
yy = exp(self%aa * xx)
end function getvalue
end module expfunc_module
program test_functors
use expfunc_module
implicit none
type(expfunc) :: func1, func2
real(wp) :: xx
func1 = expfunc(1.0_wp)
func2 = expfunc(2.0_wp)
xx = 1.0_wp
print *, func1%getvalue(xx) ! gives exp(1.0 * xx) = 2.718...
print *, func2%getvalue(xx) ! gives exp(2.0 * xx) = 7.389...
end program test_functors