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

4

我在创建一个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”(这与两个文件中构造函数签名不同的错误不同)。我能找到关于在签名文件中定义构造函数的唯一真正文档是MSDN,其中只提到无参数的构造函数。

如果您在.fs文件中悬停在Test上,则构造函数的签名与.fsi文件中的构造函数的签名相匹配。我还尝试更改构造函数,使其不是隐式的,但是没有成功。

我正在使用VS2012 RC,并尝试过.NET 4和4.5。


2
Pad的回答很好。请注意,您可以使用--sig编译器标志来查看对应于F#源文件的签名,但这并不完全符合您的要求。 - kvb
3个回答

6
这段文本涉及IT技术,太长了不能作为评论,因此我将其作为答案发布。
Test的构造函数接收两个参数,而不是一个元组。我承认在参数之间使用*符号看起来很混乱。但是,Guid -> string -> Test这样的函数签名甚至更糟糕。构造函数应该接受一些输入并生成一个新类型实例。在构造函数的上下文中,柯里化形式和部分应用程序没有意义。
我认为括号有助于澄清问题。
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报告。


3

多余的一对括号可能具有重要意义。考虑以下内容:

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

由于构造函数已经以元组形式接受参数,你会期望 'a * 'b('a * 'b) 是不同的东西。这与方法语法是一致的。


1

如果有人想解释为什么这个有效,我很想知道,但我只是开始摆弄语法,看看是否能从编译器中得到更多的信息。

如果我删除元组中的括号,它就可以编译,即将这个改变:

new : (Guid * String) -> Test

To:

new : Guid * String -> Test

2
Test的构造函数接收两个参数作为其参数,而不是一个元组。它类似于辨别联合的构造函数。只是在参数之间加上*会使类型签名看起来混乱。 - pad
我一直以为构造函数参数是作为元组传递的。如果有两个参数,那么构造函数签名应该是Guid -> String -> Test,就像接收两个参数的函数一样。但是,.fs和.fsi版本的工具提示都显示为new: (Guid * String) -> Test,这更加令人困惑。 - Mark Watts

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接