Mam zdefiniowane wiele funkcji (powiedzmy 100+), z których każda zrobić konkretną pracę, ale z tym samym podpisem. Że jest coś takiego jak:Jak dynamicznie wywołania funkcji, które zdefiniowano w wielu modułów w tym samym podpisem
module R001 (run) where run = <do-...>
module R002 (run) where run = <do-...>
Co chcę zrobić jest zapewnienie rzeczywistego „Uruchom” jako dane wejściowe użytkownika, takie, że:
main = do
runWith $ read $ getLine
where
runWith :: Int -> IO()
runWith n = R<n-padded-with-0>.run
Obecnie importować wszystkie moduły kwalifikacje i umieścić wszystkie run
„s na listę [Maybe (IO())]
, więc to działa:
runWith n = case Rs !! (read $ getLine) of
Just run -> run
Nothing -> undefined
Ale jak n
rośnie, muszę stale utrzymywać duże liście.
Czy jest jakiś sposób mogę zdefiniować dużą listę używając TemplateHaskell, lub po prostu załadować odpowiedni moduł, ile potrzeba na starcie, bez konieczności oddzielenia każdego modułu do różnych bibliotek współdzielonych.
podstawie epsilonhalbe „s odpowiedź, zrobiłem rozeznanie:
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
ten blok drukuje kod 2 następującymi wynikami run1
i run2
. Jeśli usunę ostatnie dwa wiersze, to po prostu wypisze 0. Wydaje się, że funkcje zaimportowane, ale nie wymienione, nie zostaną wyodrębnione ...
Dzięki! jest to bardzo pomocne, przynajmniej 'functionExtractor' jest dla mnie nowością. Zrobiłem trochę badań i zaktualizowałem pierwotny wpis. – claude
To jest całkiem podobne do 'prop_ *' QuickChekc. Haskell Test Framework 'HTF', który zbiera wszystkie pakiety testowe HUnit/rekordy QuickCheck w jednym pliku, używa niestandardowego preprocesora' {- # OPTIONS_GHC -F -pgmF htfpp # -} '. To jest ostatnie rozwiązanie, którego chcę użyć, ale obawiam się, że to jedyne rozwiązanie? – claude
Jestem zdecydowanie pewien, że nie jest to jedyne rozwiązanie - ale najlepsze, jakie mogę wymyślić. – epsilonhalbe