如何动态调用在同一签名中的多个模块中定义的函数

cla*_*ude 5 haskell template-haskell

我已经定义了很多函数(例如,100 +),每个函数都执行特定的工作但具有相同的签名.这就是:

module R001 (run) where run = <do-...>
module R002 (run) where run = <do-...>
Run Code Online (Sandbox Code Playgroud)

我想做的是提供实际的'run'作为用户输入,这样:

main = do
         runWith $ read $ getLine
       where
         runWith :: Int -> IO ()
         runWith n = R<n-padded-with-0>.run
Run Code Online (Sandbox Code Playgroud)

目前,我导入了所有合格的模块,并将所有的模块run放入一个列表中[Maybe (IO())],因此这有效:

runWith n = case Rs !! (read $ getLine) of 
              Just run -> run
              Nothing -> undefined
Run Code Online (Sandbox Code Playgroud)

但随着n成长,我必须不断保持一个大的名单.

有没有什么办法可以使用TemplateHaskell定义大列表,或者只是在运行时根据需要加载相应的模块,而不必将每个模块分成不同的共享库.


基于epsilonhalbe的回答,我做了一些研究:

import R1 (run1)
import R2 (run2)

test = $(functionExtractor "^run")

main :: IO ()
main = do
         putStrLn $ show $ length $ test
         run1 -- remove on second attempt
         run2 -- remove on second attempt
Run Code Online (Sandbox Code Playgroud)

这段代码在run1和的结果后打印2 run2.如果我删除最后两行,它只打印0.似乎导入但未引用的函数将不会被提取...

eps*_*lbe 5

我曾经有一个类似的问题列表中的haskell加载模块也许这有帮助.

您可以使用regexp创建函数列表,并通过该列表中的userinput选择函数.我不知道您是否必须手动输入所有"跑步"或者如果可以的话

import R*.hs (run)
Run Code Online (Sandbox Code Playgroud)

我宁愿用一个文件写一个文件run1 = …,run2 = …并生成一个所有运行列表和一个函数选择器函数,它从具有相同类型签名的函数列表中获取函数.

{-# LANGUAGE TemplateHaskell #-}
import Language.Haskell.Extract
import myRunFunctions

main = do
     let listOfRuns = $(functionExtractor "^run")
     putStrLn "please choose a run"
     putStrLn $ show listOfRuns
     let run = runWith $ read $ getLine
     run
   where
     runWith n = listOfRuns !! n
Run Code Online (Sandbox Code Playgroud)

注意:我没有运行此代码,这只是一个用haskell语法输入的思想流

我希望这是有帮助的


编辑后:
在我的例子中,我run*在一个文件中写了所有内容,然后我生成了所有运行函数的列表,这些函数立即生效 - 看看我的核苷酸项目,特别是文件Rules.hsNucleotide.hs.

Runs.hs

module Runs where
import Language.Haskell.Extract

listOfRuns = map snd $(functionExtractor "^run")

run1 = …
run2 = …
Run Code Online (Sandbox Code Playgroud)

Main.hs

import Runs

main = do
     putStrLn "please choose a run"
     putStrLn $ show listOfRuns
     let run = runWith $ read $ getLine
     run
  where
    runWith n = listOfRuns !! n
Run Code Online (Sandbox Code Playgroud)

很乐意提供帮助