我写了这个代码编译并在2010年VS.NET工程完美
module ConfigHandler
open System
open System.Xml
open System.Configuration
let GetConnectionString (key : string) =
ConfigurationManager.ConnectionStrings.Item(key).ConnectionString
然而,当我做了控制+ A和Alt + Enter键发送这FSI我得到一个错误
ConfigHandler.fs(2,1):错误FS0010:在定义构造结构的意外启动。 预期“=”或其它令牌。
好。
所以,我改变我的代码
module ConfigHandler =
open System
open System.Xml
open System.Configuration
let GetConnectionString (key : string) =
ConfigurationManager.ConnectionStrings.Item(key).ConnectionString
现在控制+ A,Alt + Enter键是成功的,我FSI很好地告诉我
模块ConfigHandler =开始VAL GetConnectionString:串 - >串端
但是现在,如果我尝试编译我的代码在VS.NET 2010,我得到一个错误信息
在图书馆或多个文件应用程序文件必须与命名空间或模块的声明,如“命名空间SomeNamespace.SubNamespace”或“模块SomeNamespace.SomeModule”开始
我怎样才能兼得? 能力VS.NET和发送模块FSI的能力编译程序吗?
有一个微小的 - 但至关重要的 - 你的代码的两个片段之间的差异是在这里指责。
F#有两种方式来声明一个module
。 首先,一个“顶层模块”,声明如下:
module MyModule
// ... code goes here
另一种方式来声明一个模块是作为一个“本地模块”,就像这样:
module MyModule =
// ... code goes here
的“顶级”和“本地”声明之间的主要区别是,局部声明之后是=
符号和一个“本地”模块中的代码必须缩进。
究其原因,你得到ConfigHandler.fs(2,1): error FS0010: Unexpected start of structured construct in definition. Expected '=' or other token.
ConfigHandler.fs(2,1): error FS0010: Unexpected start of structured construct in definition. Expected '=' or other token.
第一个片段的信息是,你不能在声明顶层模块fsi
。
当您添加=
登录到你的模块定义,它从一个顶层模块改为本地模块。 从那里,你得到了错误Files in libraries or multiple-file applications must begin with a namespace or module declaration, eg 'namespace SomeNamespace.SubNamespace' or 'module SomeNamespace.SomeModule'
,因为局部模块必须嵌套在顶层模块中或命名空间。 fsi
不允许你定义命名空间(或顶层模块),所以如果你想将整个文件复制粘贴到fsi
只有它会工作的方式是,如果你使用的编译指令作为@pad提及。 否则,你可以简单地复制粘贴本地模块定义(不包含命名空间)为fsi
和预期,他们应该工作。
参考: 模块(F#)MSDN上
常见的解决办法是保持第一示例,并创建一个fsx
它引用模块文件:
#load "ConfigHandler.fs"
你有优势,加载多个模块和编写相关的代码进行实验。
如果你真的想加载ConfigHandler.fs
直接把F#互动,您可以使用INTERACTIVE
符号和编译器指令 :
#if INTERACTIVE
#else
module ConfigHandler
#endif
它同时适用于FSI和FSC。