F#签名文件-定义构造函数参数

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

我在为一个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

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