我想编写一个使用由用户定义的函数的模块。例如:
module A
(someFun) where
someFun x = doSomethingWith externFun x
我希望externFun由用户定义,在导入模块A的文件中。有办法吗?或者这只是一个坏主意?
我当然可以将externFun作为参数传递给someFun,但是它看起来不太方便:每次调用someFun时要传递的函数都是相同的。
答案 0 :(得分:8)
其他答案是错误的: 可能!还有一个名为ImplicitParams
的小扩展名,正是为了这个而做的。例如:
-- A.hs
{-# LANGUAGE ImplicitParams #-}
module A where
someFun x = ?externFun (?externFun x)
-- B.hs
{-# LANGUAGE ImplicitParams #-}
module B where
import A
main = print (someFun 3) where
?externFun = (2*)
在ghci:
Prelude *B> main
12
瞧!有关Hugs manual,GHC manual和Implicit Parameters: Dynamic Scoping with Static Types (PDF)。
的更多信息答案 1 :(得分:6)
不,你不能这样做。把它作为一个参数传递是要走的路。但是,您可以通过使用部分应用程序来消除重复。在其他模块中做这样的事情:
import A (someFun)
someFun' = someFun externFun
现在,您可以在任何地方使用someFun'
。
答案 2 :(得分:0)
不,你应该把它作为一个论据。为什么你认为每次通话都是一样的?它就像任何其他论点一样。