是否可以在 haskell 中引用模块?我有几个模块,每个模块都公开相同的接口(两个具有相同名称和签名的函数)。是否可以列出此类模块,为每个模块调用函数。
问问题
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.
andM.
来明确说明函数或类型在哪个模块中。
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 或宏,您可能会搞砸一些事情。
于 2012-07-21T10:25:45.070 回答