我想编写一个使用函数定义的模块.例如:
module A
(someFun) where
someFun x = doSomethingWith externFun x
Run Code Online (Sandbox Code Playgroud)
我想externFun由用户定义,在导入模块A的文件中.有办法吗?或者这只是一个坏主意?
我当然可以将externFun作为参数传递给someFun,但是它看起来不太方便:每次调用someFun时要传递的函数都是相同的.
其他答案都是错的:有可能!有一个很少使用的扩展称为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*)
Run Code Online (Sandbox Code Playgroud)
在ghci:
Prelude *B> main
12
Run Code Online (Sandbox Code Playgroud)
瞧!有关Hugs手册,GHC手册和隐式参数:静态类型动态范围(PDF)的更多信息.
不,你不能这样做.把它作为一个参数传递是要走的路.但是,您可以通过使用部分应用程序来消除重复.在其他模块中做这样的事情:
import A (someFun)
someFun' = someFun externFun
Run Code Online (Sandbox Code Playgroud)
现在你可以someFun'
在任何地方使用它.