Ответ 1
Я не эксперт в FSI, но некоторые эксперименты предполагают, что пространства имен поддерживаются только объявлениями #load
(а не через типичные взаимодействия - отправка группы декларации пространства имен в VFSI через Alt-Enter не работает), и что разные взаимодействия вносят разные "примеры". Например, с файлом кода
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 #, которая говорит
В группе декларации пространства имен, само пространство имен неявно открывается, если какое-либо предыдущее пространство имен групп декларации или ссылок сборки способствуют этому пространство имен, например.
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
на верхний уровень, прежде чем пытаться (неявно) ссылаться на него позже.