在为F#脚本文件创建签名文件时遇到错误,我无法解决这个问题.
要复制,请创建一个新的F#类库并添加一个文件Test.fs:
namespace Signatures
open System
type Test (id : Guid, name : string) =
member this.Id = id
member this.Name = name
Run Code Online (Sandbox Code Playgroud)
这将很好.然后在它上面创建一个新的签名文件Test.fsi:
namespace Signatures
open System
type Test =
new : (Guid * String) -> Test
member Id : Guid
member Name : String
Run Code Online (Sandbox Code Playgroud)
现在这不会构建错误Module 'Signatures' requires a value 'new : (Guid * String) -> Test(这与两个文件中构造函数签名不同时所获得的错误不同).我在签名文件中定义构造函数时可以找到的唯一真实文档是MSDN,它处理无参数构造函数.
如果将鼠标悬停在.fs文件中的Test上,则构造函数的签名与.fsi文件中的签名匹配.我也尝试过更改构造函数,这样就不会隐藏任何快乐.
我正在使用VS2012 RC,并尝试过.Net 4和4.5.
评论太长了,所以我将其作为答案发布.
Test的构造函数接收两个参数作为参数,而不是一个参数,它是一个元组.我承认*论点之间看起来很混乱.但签名Guid -> string -> Test甚至比这更糟糕.构造函数应该获得一些输入并生成一个新的类型实例.在构造函数的上下文中,Curried形式和部分应用程序没有意义.
我认为括号有助于澄清这里.
type Test (id : System.Guid, name : string) =
member this.Id = id
member this.Name = name
Run Code Online (Sandbox Code Playgroud)
生产new : id:Guid * name:string -> Test时
type Test (tuple: System.Guid * string) =
let id, name = tuple
member this.Id = id
member this.Name = name
Run Code Online (Sandbox Code Playgroud)
让我new : tuple:(Guid * string) -> Test参加FSI会议.我使用F#2.0/MonoDevelop 3.0作为记录.
关于创建类型签名,我通常将代码发送到F#Interactive并将生成的签名复制到fsi文件以避免错误.如果工具提示和F#Interactive在VS2012 RC上错误地显示类型签名,则应该在fsbugs(at)microsoft(dot)com上报告.