F#签名文件-定义构造函数参数
我在为一个F#脚本文件创建签名文件时遇到了一个错误,我无法完全解决这个问题 要进行复制,请创建一个新的F#类库并添加一个文件Test.fs:F#签名文件-定义构造函数参数,f#,F#,我在为一个F#脚本文件创建签名文件时遇到了一个错误,我无法完全解决这个问题 要进行复制,请创建一个新的F#类库并添加一个文件Test.fs: namespace Signatures open System type Test (id : Guid, name : string) = member this.Id = id member this.Name = name 这将建立良好的。然后在上面创建一个新的签名文件Test.fsi: namespace Signatures
namespace Signatures
open System
type Test (id : Guid, name : string) =
member this.Id = id
member this.Name = name
这将建立良好的。然后在上面创建一个新的签名文件Test.fsi:
namespace Signatures
open System
type Test =
new : (Guid * String) -> Test
member Id : Guid
member Name : String
这将不会生成错误模块'Signatures'需要一个值'new:(Guid*String)->Test
(这与两个文件中的构造函数签名不同时得到的错误不同)。关于在签名文件中定义构造函数,我能找到的唯一真正的文档是和,它处理无参数构造函数
如果将鼠标悬停在.fs文件中的Test上,则构造函数的签名与.fsi文件中的签名匹配。我还尝试更改构造函数,使其不会毫无乐趣地隐式
我正在使用VS2012 RC,并且已经尝试了.Net 4和4.5。如果有人想解释为什么会这样,我很想知道,但我刚刚开始修改语法,看看是否可以从编译器中获得更多启示 如果我删除了元组的方括号,则元组将编译,即更改为:
new : (Guid * String) -> Test
致:
评论太长了,所以我把它作为一个答案发布
Test
的构造函数接收两个参数作为其参数,而不是一个元组参数。我承认参数之间的*
看起来很混乱。但是签名Guid->string->Test
甚至比这更糟糕。构造函数应该获得一些输入并生成一个新的类型实例。在构造函数的上下文中,curry形式和部分应用程序没有意义
我认为括号有助于澄清这一点
type Test (id : System.Guid, name : string) =
member this.Id = id
member this.Name = name
生成new:id:Guid*name:string->Test
while
type Test (tuple: System.Guid * string) =
let id, name = tuple
member this.Id = id
member this.Name = name
在FSI会话中为我提供new:tuple:(Guid*string)->Test
。我使用F#2.0/MonoDevelop 3.0作为记录
关于创建类型签名,我通常将代码发送到F#Interactive中,并将生成的签名复制到
fsi
文件中以避免错误。如果工具提示和F#Interactive在VS2012 RC上错误地显示了类型签名,您应该向fsbugs(at)microsoft(dot)com报告 额外的一对paren可能很重要。考虑以下事项:
T型=
静态成员添加(x,y)=x+y
静态成员AddTuple((x,y))=x+y
在C#中,显示为
intadd(intx,inty)
int AddTuple(Tuple arg)
切向而言,您不能在构造函数中执行类似的操作:
类型测试((id,name))=类结束//未编译
由于构造函数已经采用元组形式的参数,您可能会认为
'a*'b
和('a*'b)
是不同的东西。这与方法语法一致。测试的构造函数接收两个参数作为其参数,而不是一个元组参数。它类似于歧视联合的构造。只是参数之间的*
使类型签名看起来很混乱。我一直认为构造函数参数是作为元组传递的。如果是两个参数,那么构造函数签名应该是Guid->String->Test,就像接收两个参数的函数一样?.fs和.fsi版本的工具提示都显示为new:(Guid*String)->Test,只是为了增加混乱。Pad的答案很好。请注意,您可以使用--sig
编译器标志查看哪些签名将对应于F#源文件,尽管这并不完全是您所要求的。
type Test (tuple: System.Guid * string) =
let id, name = tuple
member this.Id = id
member this.Name = name