2010-03-01 2 views
25

F #의 모듈과 네임 스페이스에 대해 otherquestions을 알고 있지만 지금 당장 도움이되지 않습니다.F #, 네임 스페이스, 모듈, fs 및 fsx

나는

Utilities.fs

namespace Company.Project.Namespace 
module Utilities = 
    //stuff here 

Functions.fs

namespace Company.Project.Namespace 
open Utilities 

module Functions = 
    //stuff here 

와 프로젝트를 가지고 그리고 나는 FSX에서 테스트하기 위해 노력하고있어 :

#load "Utilities.fs" 
#load "Functions.fs" 

으로 FSI에 보내려고 할 때 error FS0039: The namespace or module 'Utilities' is not defined이됩니다.

스크립트 파일의 맨 위에 동일한 네임 스페이스를 추가하려고했지만 그다지 좋아하지 않습니다.

이상한 점은 백그라운드 컴파일러가 저를 외치는 것이 아니라는 것입니다.

이것은 작동하는 것처럼 보이지만 올바른 승인입니까? 네임 스페이스, 모듈, 클래스, 스크립트 파일 등 시험 :

#load "Utilities.fs" 
open Company.Project.Namespace 
#load "Functions.fs" 

이 모든 것들을 통합하는 방법의 예를 포함 어딘가에 '참조'FSharp 프로젝트가 있습니까?

답변

8

저는 FSI의 전문가는 아니지만 일부 실험에서는 네임 스페이스가 #load 선언에 의해서만 지원된다고 제안합니다 (일반적인 상호 작용을 통해서가 아니라 Alt-Enter를 통해 네임 스페이스 선언 그룹을 VFSI로 보내지 않음). 그리고 다른 상호 작용은 다른 '인스턴스'에 기여합니다. 예를 들어, 코드 파일

namespace Foo 

type Bar() = 
    member this.Qux() = printfn "hi" 

namespace Other 

type Whatever() = class end 

namespace Foo 

module M = 
    let bar = new Bar() 
    bar.Qux() 

에 좀 더 내가 예를 들어, 일단보다 그것을 #load 경우

> [Loading C:\Program.fs] 
hi 

namespace FSI_0002.Foo 
    type Bar = 
    class 
     new : unit -> Bar 
     member Qux : unit -> unit 
    end 
namespace FSI_0002.Other 
    type Whatever = 
    class 
     new : unit -> Whatever 
    end 
namespace FSI_0002.Foo 
    val bar : Bar 

> #load @"C:\Program.fs";; 
> [Loading C:\Program.fs] 
hi 

namespace FSI_0003.Foo 
    type Bar = 
    class 
     new : unit -> Bar 
     member Qux : unit -> unit 
    end 
namespace FSI_0003.Other 
    type Whatever = 
    class 
     new : unit -> Whatever 
    end 
namespace FSI_0003.Foo 
    val bar : Bar 

> new Foo.Bar();; 
> val it : Foo.Bar = FSI_0003.Foo.Bar 

FSI_0003.Foo.Bar가 FSI_0002 버전을 숨기고있는 것 같습니다. 항 네임 스페이스 선언 그룹 또는 참조 어셈블리에 기여하는 경우

그래서 열 암시

네임 스페이스 선언 그룹 내에서

, 네임 스페이스 자체를 말한다 F 번호 사양의 일부이다 생각하고 있어요 this 네임 스페이스, 예.

namespace MyCompany.MyLibrary 

    module Values1 = 
     let x = 1 

namespace MyCompany.MyLibrary 

    // Implicit open of MyCompany.MyLibrary bringing Values1 into scope 

    module Values2 = 
     let x = Values1.x 

그러나 이것은 단지 스페이스 선언 그룹에 선행하여 구성으로 공간을 연다.

FSI는 이름 공간에 대한 제한된 이해를 고려할 때 FSI와 상호 작용하지 않습니다. 구체적으로 말하자면, 예에서 '두 번째 #load'가 열리기를 기대합니다. FSI_000N+1의 네임 스페이스 버전이며 이전 코드는 FSI_000N입니다.어느 것이 어쩌면 - 명시 적으로 open 상호 작용으로 수정되는 이유를 설명 할 수 있습니다. 나중에 암시 적으로 참조하기 전에 그림자가있는 기존의 FSI_000N 항목을 최상위 수준으로 가져옵니다.

+3

그래, 그런데 내 질문은 내 실제 코드의 물결 무늬가있는 예였다. 나는 각 #load 파일 사이의 네임 스페이스를 다시 열어서 작동하도록했다. – Benjol

7

내가 너무이 비교적 새로운 해요,하지만 이것은 내가 FSX 파일에 테스트있을 때 나를 위해 작동 것입니다 :이 라이브러리를 사용하여 내 코드에 의해

#if INTERACTIVE 
#r @"C:\Program Files\FSharpPowerPack-2.0.0.0\bin\FParsec.dll" 
#r @"C:\Program Files\FSharpPowerPack-2.0.0.0\bin\FParsecCS.dll" 
#endif 

open FParsec.Primitives 
open FParsec.CharParsers 

을 따랐다.

+0

나는 그 dll의 순서를 바꾸는 것이 효과가 없다고 생각한다. – nicolas