2011-03-21 2 views
1

함수 f1 :: a -> b -> ... -> c 및 다른 함수 f2 :: PossibleTypeClass xy ​​... => x -> y - > ... -> z, 런타임에 c (f1의 출력)가 f2에 x 또는 y 또는 다른 입력으로 전달 될 수 있는지를 결정하고자합니다.Haskell에서 런타임에 함수 매개 변수의 호환성 확인

나는 소스를 제어 할 수 있기 때문에 런타임에 사용하기 위해 메타 데이터 (템플릿 haskell, 아마도?)를 생성하는 방법이 있다면 괜찮을 것이다. 환언

...

난 입출력 세트를 가질 수 (상태 일 수 있고, 어쩌면 화살표 모양, 연산 것을 생각한다) 다수의 기능을 갖는다. 어떤 입력을 어떤 출력으로 연결하여 사용자가 서로 연결할 수 있는지 알고 싶습니다. 그런 일이 발생하면 사용자가 구성한 방법에 따라 코드 (또는 이와 비슷한 코드)를 생성 할 수 있습니다.

내가 직접 작성한 기능이나 사용자가 작성할 수있는 기능이 있으므로 컴파일 된 형식으로 가져올 수 있습니다. 그러나 매우 단순하다면 메타 데이터를 생성하기 위해 (필요한 경우) 코드의 특정 사항을 요구할 수 있습니다.

가장 큰 과제는 유형 클래스를 사용하는 것입니다. 구체적인 유형의 출력이 입력의 유형 클래스의 인스턴스인지 여부를 찾는 방법입니다.

+3

하스켈에서 런타임시 이런 종류의 일을하는 것은 어지러운 것 같습니다. 컴파일 타임에 이것을 할 수 있도록하는 sofisticated type 시스템의 목적이 아닌가? – hugomg

+0

물론, 런타임 이후에 컴파일 시간이 오면 어떨까요? 나는 사용자가 구성되고 함께 실행되는 구성 요소를 구성 할 수있는 무언가를 만들고 있습니다. 각자의 타입 시그니처를 기반으로 어떤 컴포넌트가 서로 연결될 수 있는지 알아야합니다. 다른 말로하면, 런타임에 타입 안전하고 컴파일 가능한 프로그램을 생성하는 방법을 알아야합니다. – mentics

+1

ADT로 하스켈 유형을 나타내는 무언가가 필요합니까? 프로그램 자체의 코드를 분석하는 것이 아니라 컴파일되지 않은 다른 프로그램의 코드를 분석하고 싶습니까? 아마 너의 문제를 이해하지 못했을거야. – fuz

답변

1

아마도, 당신이 원하는 것은 모듈 Data.Dynamic으로 가능합니다. 동적 프로그래밍을 수행하는 대수 데이터 유형 Dynamic을 제공합니다. 모듈은 사용하기 위해 저장되지만, 단일형 유형 만 사용할 수도 있습니다.

+0

어떻게 런타임에 유형 호환성에 대한 정보를 제공 할 것입니까? – mentics

+0

@taotree :'dynApply'를 사용할 수 있습니다. 적용이 가능하다면 적용 값을 반환하고 그렇지 않으면 Nothing을 반환합니다. – fuz

+0

내가 생각하기에 형식 형 클래스이기 때문에 단일 형에 대한 제한이 문제가 될 것이라고 생각합니다. 구체적인 유형의 경우는 다소 간단합니다. 그러나 구체적인 출력 유형을 입력 유형 제한된 입력과 일치시키는 것은 그 도전입니다. – mentics

2

귀하의 질문에 대한 귀하의 의견은 GHC API 또는 힌트와 같은 것입니다. 둘 다 방금 컴파일 한 코드의 AST 표현에 액세스하는 방법입니다. GHCi는 GHC API를 기반으로하며 힌트는 GHC API를 둘러싼 멋진 래퍼입니다.