2012-12-30 1 views
9

나는 하스켈 컴파일러를 약간 작성하고 있으며 가능한 한 많은 하스켈 2010을 구현하고 싶다. 내 컴파일러는 모듈을 구문 분석 할 수 있지만 모듈을 프로그램에 완료하는 것은 쉬운 일이 아닌 것처럼 보입니다. 나는 까다로운,하지만 어쩌면 유효, 하스켈 모듈의 예 만들어 : 여기edge case의 해싱 모듈의 수입과 수출

module F(G.x) where 
    import F as G 
    x = 2 

모듈 F 수출 G.x,하지만 G.xF.x와 같은, 그래서 모듈은 F 수출 x 경우에 한해, 그것은 수출 x. 이 예에서

module A(a) where 
    import B(a) 
    a = 2 

module B(a) where 
    import A(a) 

는 컴파일러가 B에서 수입 a가 선언 된 a = 2 같은 경우 확인하는 모듈 A의 수출하지만, B 수출 a 경우에 한해, A 수출 a를 해결합니다. 모듈 A를 해결하는 동안

module A(f) where 
    import B(f) 

module B(f) where 
    import A(f) 

는 컴파일러 may've는 A 수출 f는, 따라서 BA(f)를 가져 오기 및 내보내기 f 수 있다는 것을 의미, B에서 수입 f이 존재한다고 가정. 유일한 문제는 아무데도 정의 된 f가 없다는 것입니다. 여기

module A(module X) where 
    import A as X 
    import B as X 
    import C as X 
    a = 2 

module B(module C, C.b) where 
    import C 
    b = 3 

module C(module C) 
    import B as C 
    c = 4 

module 수출은 수출 목록은 서로 그 자체에 의존 유발.

이러한 모든 예제는 하스켈 2010 사양에 정의 된대로 유효한 하스켈이어야합니다.

하스켈 모듈을 정확하고 완벽하게 구현하는 방법이 있는지 알고 싶습니다.

모듈은 단지 (단순) 변수 바인딩 import들 (아마도 as 또는 qualified)와, 가능 정규화 변수 수출 목록 module ... 약어를 포함한다고 가정. 각 모듈
  • 링크 그의 결합
  • 링크의 결합에 모든 모듈에 사용 된 모든 (아마도 정규화) 변수에 대한 모든 수출 변수 반출 변수

    • 컴퓨팅 한정된리스트 :이 알고리즘은 할 수 있어야
  • 답변

    9

    A Formal Specification for the Haskell 98 Module System에 관심이 있으실 것입니다.

    나는 블로그 게시물 시리즈 중 몇 가지 흥미로운 사례를 다루고 있으며 그 중 단지 first one 만 게시됩니다.

    마지막으로, 나는 하스켈 모듈을 다루는 라이브러리에 대해 정확히 작업하고 있습니다. haskell-names이라고합니다.

    목표에 따라 컴파일러에서 사용하거나 소스 코드를 연구하거나 기여할 수 있습니다. (당신의 예제는 훌륭한 테스트 케이스를 만들 것입니다.)


    질문에 대답 : 재귀 모듈은 고정 소수점을 계산하여 처리됩니다.

    모듈 그래프에서 강하게 연결된 구성 요소로 시작하십시오. 이 구성 요소의 각 모듈에 대해 아무것도 내보내지지 않는다고 가정합니다. 그런 다음이 모듈을 다시 방문하고 새로운 정보를 기반으로 새로운 내보내기 목록을 계산합니다. 내보내기 목록이 커질 때마다 (또는 적어도 축소되지 않을 때마다)이 프로세스가 단조롭다는 것을 증명할 수 있습니다. 머지 않아 성장을 멈추고 고정 점에 도달했습니다.

    정적 분석에서 아이디어를 빌려 (이 커뮤니티는 고정 소수점을 계산할 때 매우 유용함)이 알고리즘을 최적화 할 수 있지만 내 패키지는 현재 순진한 알고리즘 (code)을 구현합니다.

    +0

    와우, 고맙습니다. 실제로이 문제를 목표로하는 서류와 라이브러리가 있습니다. :) –