haskell的外部功能?

Gui*_*rel 6 haskell

我想编写一个使用函数定义的模块.例如:

module A
(someFun) where

someFun x = doSomethingWith externFun x
Run Code Online (Sandbox Code Playgroud)

我想externFun由用户定义,在导入模块A的文件中.有办法吗?或者这只是一个坏主意?

我当然可以将externFun作为参数传递给someFun,但是它看起来不太方便:每次调用someFun时要传递的函数都是相同的.

Dan*_*ner 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*)
Run Code Online (Sandbox Code Playgroud)

在ghci:

Prelude *B> main
12
Run Code Online (Sandbox Code Playgroud)

瞧!有关Hugs手册,GHC手册隐式参数:静态类型动态范围(PDF)的更多信息.


ham*_*mar 6

不,你不能这样做.把它作为一个参数传递是要走的路.但是,您可以通过使用部分应用程序来消除重复.在其他模块中做这样的事情:

import A (someFun)
someFun' = someFun externFun
Run Code Online (Sandbox Code Playgroud)

现在你可以someFun'在任何地方使用它.