2011-12-19 13 views
6

ユーザーが定義する関数を使用するモジュールを作成したいと思います。例:関数haskellのextern関数?

module A 
(someFun) where 

someFun x = doSomethingWith externFun x 

モジュールAをインポートするファイルで、externFunをユーザーが定義したいと思いますか?それとも悪い考えですか?

私はもちろんsomeFunの引数としてexternFunを渡すことができますが、それは非常に便利ではありません。渡される関数はsomeFunの呼び出しごとに同じになります。

+1

downvoterからのいくつかのコメントは非常に助けになるでしょう –

答えて

8

他の回答は間違っています:です!これを行うためにちょうど作られたImplicitParamsというちょっとした拡張があります。たとえば、次のGHCiの中

-- 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*) 

Prelude *B> main 
12 

出来上がり! Hugs manualGHC manual、およびImplicit Parameters: Dynamic Scoping with Static Types (PDF)の詳細については、

+0

ありがとう。それは良いとhaskelly行く方法ですか?関数をパラメータ(設計または効率の面で)として渡すことには、それを使用することの不利な点がありますか? –

+0

@flagadabla私はそれがあまり一般的ではないと思いますが、関数を明示的に渡すことに比べて、設計や効率上の懸念があるかどうかはわかりません。 –

0

いいえ、あなたは議論として取るべきです。なぜあなたはそれがそれぞれの呼び出しで同じになると思いますか?それは他の議論のように機能します。

6

いいえ、できません。議論としてそれを渡すことは行く方法です。ただし、部分的なアプリケーションを使用して反復を排除できます。

import A (someFun) 
someFun' = someFun externFun 

今、あなたの代わりにどこでもsomeFun'を使用することができます。ただ、他のモジュールでは、このような何かを行います。