haskellでモジュールを参照することは可能ですか? いくつかのモジュールがあり、それぞれが同じインターフェイス (同じ名前と署名の 2 つの関数) を公開しています。そのようなモジュールのリストを作成して、各モジュールの関数を呼び出すことは可能ですか?
質問する
311 次
2 に答える
3
インターフェイスのデータ型を定義するのはどうですか?各モジュールはデータ型の単一のインスタンスを提供し、その後、すべてのインスタンスを反復処理できます。
-- ModuleInterface.hs
-- Replace types of the functions with actual types
data ModuleInterface = ModuleInterface (Int -> Bool -> Int) (String -> Int)
-- ModuleA.hs
moduleInterface :: ModuleInterface
moduleInterface = ModuleInterface f1 f2
-- Declare f1 and f2
-- ModuleB.hs
moduleInterface :: ModuleInterface
moduleInterface = ModuleInterface f1 f2
-- Declare f1 and f2
-- Main.hs
-- Simple example showing how to "call" all of the functions. If you are doing
-- IO, then you would have to use something like mapM.
transform :: [ModuleInterface] -> Int -> Bool -> String -> [(Int, Int)]
transform interfaces i b s = map f interfaces
where f (ModuleInterface g h) = (g i b, h s)
于 2012-07-21T12:00:12.167 に答える
0
あなたが何を望んでいるのかわかりませんが、名前の競合は通常、修飾されたインポートを使用するだけで解決されます。S.
以下の例では、 andを観察してM.
、関数または型がどのモジュールにあるかを明示的に示しています。
import qualified Data.Set as S
import qualified Data.Map as M
mySet :: S.Set Int
mySet = S.fromList [1,2,3]
myMap :: M.Map String Int
myMap = M.fromList [("a", 1), ("b", 2), ("c", 3)]
main = do
print mySet
print myMap
print $ S.member 2 mySet
print $ M.lookup "c" myMap
しかし、あなたの質問から、モジュールである値setModule, mapModule :: Module
を持ち、 のようなゲッターを使用するメタプログラミングソリューションを探しているようgetFunctions :: Module -> [Functions]
です。静的に型付けされた言語には適合しないため、これは存在しないと確信しています。ただし、Template Haskell やマクロをひどく誤用すると、おそらく何かをかき立てることができます。
于 2012-07-21T10:25:45.070 に答える