각기 특정 작업을 수행하지만 동일한 서명을 가진 많은 함수 (예 : 100+)를 정의했습니다. 내가 뭘하고 싶어하는 것은 있도록, 사용자의 입력과 실제 '실행'을 제공하는 것입니다동일한 서명의 여러 모듈에 정의 된 함수를 동적으로 호출하는 방법
module R001 (run) where run = <do-...>
module R002 (run) where run = <do-...>
: 뭔가처럼 즉, 나는 모든 모듈 자격으로 가져올 현재
main = do
runWith $ read $ getLine
where
runWith :: Int -> IO()
runWith n = R<n-padded-with-0>.run
, 넣어 모든 run
[Maybe (IO())]
의 목록에 '들 때문에,이 작품 :
runWith n = case Rs !! (read $ getLine) of
Just run -> run
Nothing -> undefined
그러나 n
가 성장함에 따라, 내가 지속적으로 큰 목록을 유지해야합니다.
TemplateHaskell을 사용하여 큰 목록을 정의 할 수있는 방법이 없으며 각 모듈을 다른 공유 라이브러리로 분리하지 않고도 런타임시 필요한 모듈을로드 할 수 있습니다. run1
및 run2
의 결과 다음과 같은 코드가 인쇄 2의
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
이 블록 : epsilonhalbe의 답변에 따라
는, 나는 몇 가지 조사를했다. 마지막 두 줄을 제거하면 단지 0이 출력됩니다. 가져온 기능이지만 참조되지 않은 함수는 추출되지 않습니다 ...
고마워요! 이것은 매우 유용합니다. 최소한'functionExtractor'는 저에게 새로운 것입니다. 나는 약간의 조사를했고, 최초의 지위를 최신의 것으로 바꿨다. – claude
이것은 QuickChekc의'prop_ * '와 아주 비슷합니다. 하나의 파일에서 모든 HUnit 테스트 케이스/QuickCheck 서브를 수집하는 Haskell 테스트 프레임 워크'HTF'는 커스텀 프리 프로세서'{- # OPTIONS_GHC -F -pgmF htfpp # -}'를 사용합니다. 이것이 내가 사용하기를 원하는 마지막 해결책이지만 이것이 유일한 해결책 일까? – claude
나는 이것이 유일한 해결책이 아니라는 것을 확실히 확신하고 있습니다 -하지만 최선을 다할 수 있습니다. – epsilonhalbe