2012-07-21 98 views
0

haskell中可以引用模塊嗎?我有幾個模塊,每個模塊都暴露相同的接口(兩個同名和簽名的函數)。是否有可能列出這些模塊,以便爲每個模塊調用函數。Haskell對模塊的引用

回答

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

我不確定你想要什麼,但名稱衝突通常只需使用合格的導入來解決。在下面的一個例子觀察S.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,並且使用getter就像getFunctions :: Module -> [Functions]。我確信這不存在,因爲它不適合靜態類型語言。然而,如果你嚴重誤用Template Haskell或宏,你可能會掀起一些東西。

+0

是的,TH是主意。謝謝。 – KAction 2012-07-21 10:34:45