在为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
现在不会使用错误Module 'Signatures' requires a value 'new : (Guid * String) -> Test
构建(如果两个文件中的构造函数签名不同,则与您获得的错误不同)。我在签名文件中定义构造函数时可以找到的唯一真实文档是MSDN,它处理无参数构造函数。
如果将鼠标悬停在.fs文件中的Test上,则构造函数的签名与.fsi文件中的签名匹配。我也尝试过更改构造函数,这样就不会隐藏任何欢乐。
我正在使用VS2012 RC,并尝试过.Net 4和4.5。
答案 0 :(得分:6)
评论太长了,所以我将其作为答案发布。
Test
的构造函数接收两个参数作为参数,而不是一个参数,它是一个元组。我承认论点之间的*
看起来很混乱。但签名Guid -> string -> Test
甚至比这更糟糕。构造函数应该获得一些输入并生成一个新的类型实例。在构造函数的上下文中,Curried形式和部分应用程序没有意义。
我认为括号有助于澄清。
type Test (id : System.Guid, name : string) =
member this.Id = id
member this.Name = name
生成new : id:Guid * name:string -> Test
而
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上报告。
答案 1 :(得分:3)
额外的一对parens可能很重要。请考虑以下事项:
type T =
static member Add(x, y) = x + y
static member AddTuple((x, y)) = x + y
,在C#中,显示为
int Add(int x, int y)
int AddTuple(Tuple<int, int> arg)
切线,你不能在构造函数中做类似的事情:
type Test((id, name)) = class end //DOESN'T COMPILE
由于构造函数已经以tupled形式获取参数,因此您希望'a * 'b
和('a * 'b)
是不同的东西。这与方法语法一致。
答案 2 :(得分:1)
如果有人想解释为什么会这样,我很想知道,但我刚开始摆弄语法,看看我是否能从编译器中得到更多的启示。
如果我删除括号是元组,它会编译,即改变它:
new : (Guid * String) -> Test
要:
new : Guid * String -> Test