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

Mar*_*tts 4 f#

在为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.

pad*_*pad 6

评论太长了,所以我将其作为答案发布.

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上报告.