2012-01-07 1 views
2

다른 파일에서 함수의 정의를 가져 오는 'load'라는 함수를 만들고 싶습니다. 모듈을 가져 오는 방법을 알고 있지만, 내 프로그램에서는이 새로운 함수로 어떤 모듈이 '로드'되었는지에 따라 함수의 정의가 변경되기를 원합니다. 이것을 할 수있는 방법이 있습니까? 필요하지 않도록 내 프로그램을 작성하는 더 좋은 방법이 있습니까?문자열을 입력으로 사용하여 모듈 가져 오기

유형 서명은 다음과 같을 것이라고 생각합니다. load :: String -> IO() 여기서 string은로드 할 모듈의 이름이고 모듈은 같은 디렉토리에 있습니다.

편집 : 모든 답장을 보내 주셔서 감사합니다. 대부분의 사람들은 이것이 내가 원하는 것을하기위한 최선의 방법이 아니라는 데 동의합니다. 대신 I/O 프로그램에서 전역 변수를 선언하는 방법이 있습니까? 즉, String-IO() 형식의 함수에 "thing"을 입력하면 GHCi에 'thing'을 입력하여 값을 할당 할 수 있기를 원합니다. 제안 사항 ?

+1

이것이 유용 할 것이라고 생각되는 예를 들려 줄 수 있습니까? 나는 그것이 가능하지 않다는 느낌을 가지고있다. (또는 적어도 쉽다.) 그러나 나는 당신의 문제를 해결할 더 좋은 것이 있다고 확신한다. 나는 당신이 직면하고있는 실제 문제가 무엇인지 확실하지 않습니다. –

+2

이런 일을하는 것은 ... * 가능합니다. 그러나 GHCi 나 그 밖의 것들과 같은 것을 쓰지 않는 한, 당신이 실제로 원하기는 매우 어렵습니다. –

답변

2

프로그램을 작성하는 것이 더 확실한 방법이므로, 필요하지 않습니다. 그러나 상황에 대한 자세한 내용을 알지 못하면 무엇을 말하기가 어렵습니다. 예를 들어, 각 모듈이 데이터 유형으로 구현하는 일반 인터페이스를 나타내고 각 모듈이 해당 유형의 값을 구현과 함께 내보내도록 할 수 있습니다.

기본적으로로드 된 모듈 집합은 정적이며 컴파일 타임 속성이므로 프로그램의 동작이 내용에 따라 변경되기를 원하지 않습니다. 도서관을 쓰고 싶니? 사용자는 아마도 : 그것은 그들의 수입 목록에 같은 사악한 마법을하고 감사하지 않을 것이다 (그리고 아마도 어쨌든,이 경우 템플릿 하스켈없이 할 수 없습니다.)


예외는 당신이 인 경우입니다 하스켈 도구 (예 : REPL, IDE 등)를 구현하거나 플러그인을 만들려고합니다. Haskell 소스 코드의 모듈을 동적으로로드하여 Haskell 프로그램에 통합합니다. 그 (것)들을 시도하는 첫번째 것은 hint이어야한다, 그러나 당신은 당신이 무언가 더 진보 된 무언가를 찾아 낼지도 모른다; 이 경우 GHC API이 최선의 방법 일 것입니다. plugins은이 분야에서 사실상 표준 이었지만 GHC 7에서는 컴파일되지 않았습니다. 당신은 유사한 인터페이스의 간단한 구현 인 direct-plugins을 확인하고 싶을 것입니다.

mueval과 관련있을 수 있습니다. lambdabot에 의해 사용되는 안전한 샌드 박스에서 하스켈 코드의 짧은 (한 줄짜리) 코드 조각을 실행하도록 설계되었습니다.

1

하스켈 IDE 또는 그와 비슷한 것을 만들지 않는 한이 (^ 1)이 필요하지 않습니다.

그러나, 당신이 할 경우, 당신은 당신의 프로그램으로 하스켈 통역을 포함 할 수있는, 항상 hint-package있다. 이렇게하면 런타임에 haskell 모듈을로드하고 문자열을 haskell 값으로 변환 할 수 있습니다. 당신은 몇 가지 변화, 즉 일을 다형성 만들 수있는 방법을 찾고 있다면,하지만 코드에서의 모든 정의는, 당신은 위치 :이 그것을 사용 here


^1 방법의 좋은 예입니다 아마도 typeclasses을 찾고있을 것입니다.

0

편집과 관련하여 아마도 IORef에 관심이있을 것입니다.