1

haskellでモジュールを参照することは可能ですか? いくつかのモジュールがあり、それぞれが同じインターフェイス (同じ名前と署名の 2 つの関数) を公開しています。そのようなモジュールのリストを作成して、各モジュールの関数を呼び出すことは可能ですか?

4

2 に答える 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 に答える