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

时间:2012-07-30 17:47:33

标签: 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

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。

3 个答案:

答案 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