我刚开始学习F#(之前几乎没有.NET经验),请原谅我可能是一个非常简单的问题:F#中命名空间和模块之间的区别是什么?
谢谢
戴夫
编辑:谢谢Brian的回答.这就是我想知道的.只是澄清:您是否也可以打开命名空间(类似于C#using语句)?
使用AutoOpen属性的推荐原则是什么?
(这个问题可能是在类似命名类型上何时使用模块功能VS静态功能的延续)
专家F#指出"当你定义ad hoc顶级运算符和函数时,这可能很有用:"
因此,这似乎可以减少代码组织中的模块角色,当您在技术上需要编写代码但从客户端角度删除它的存在时.
还有别的吗?你什么时候使用它?
我编写了这段代码,它在VS.NET 2010中编译并完美地运行
module ConfigHandler
open System
open System.Xml
open System.Configuration
let GetConnectionString (key : string) =
ConfigurationManager.ConnectionStrings.Item(key).ConnectionString
Run Code Online (Sandbox Code Playgroud)
但是,当我执行控制+ 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
Run Code Online (Sandbox Code Playgroud)
现在Control + A,Alt + Enter成功了,我很好地告诉我FSI
module ConfigHandler = begin val GetConnectionString:string - > string end
但是现在如果我尝试在VS.NET 2010中编译我的代码,我会收到一条错误消息
库或多文件应用程序中的文件必须以命名空间或模块声明开头,例如'namespace SomeNamespace.SubNamespace'或'module SomeNamespace.SomeModule'
我怎么能两个都有?能否在VS.NET中编译并能够将模块发送到FSI?
如果我编写以下F#代码,编译器会发出错误.
let a = 123
let a = 123
Run Code Online (Sandbox Code Playgroud)
产生的错误是:
错误FS0037:值'a'的重复定义
如果我在这样的函数中编写相同的代码:
let fctn =
let a =123
let a =123
a
Run Code Online (Sandbox Code Playgroud)
它不会产生任何错误.
我不明白其中的区别.有人可以解释一下吗?
编辑:我在模块级写的第一个代码.
我尝试以多种方式执行以下函数,但总是出错.那我该如何执行constructQuery:
type PersonName =
| FirstOnly of string
| LastOnly of string
| FirstLast of string * string
let constructQuery personName =
match personName with
| FirstOnly(firstName) -> printf "May I call you %s?" firstName
| LastOnly(lastName) -> printf "Are you Mr. or Ms. %s?" lastName
| FirstLast(firstName, lastName) -> printf "Are you %s %s?" firstName lastName
Run Code Online (Sandbox Code Playgroud)
-编辑-.
我试过调用这个函数:
constructQuery "himekami"
constructQuery ("himekami" : PersonName.FirstOnly)
constructQuery PersonName.FirstOnly("himekami")
Run Code Online (Sandbox Code Playgroud)
和产生的错误是这样的:
Analyzer.fs(12,17): error FS0001: This expression was expected to have type
PersonName
Run Code Online (Sandbox Code Playgroud)
但这里有字符串 …