F# 抽象元组函数中的参数名

F# 抽象元组函数中的参数名,f#,c#-to-f#,F#,C# To F#,与之相关的是,如何使用C#风格的元组参数来实现这一点?所以如果我想 abstract member createEmployee : (string * string) -> Employee 我如何才能沟通是否应该这样做 1- member this.createEmployee(firstName, lastName) = ... 2- member this.createEmployee(lastName, firstName) = ... 用例:在F#中创建一个从C#使

与之相关的是,如何使用C#风格的元组参数来实现这一点?所以如果我想

abstract member createEmployee : (string * string) -> Employee
我如何才能沟通是否应该这样做

1-   member this.createEmployee(firstName, lastName) = ...
2-   member this.createEmployee(lastName, firstName) = ...

用例:在F#中创建一个从C#使用的接口。

我认为最简单的方法是这样:

type FirstName = FirstName of string
type LastName  = LastName of string

...

abstract member createEmployee : (FirstName * LastName) -> Employee
备注: 你可能希望它是这样的

abstract member createEmployee : FirstName * LastName -> Employee

相反,由于存在细微差异;)

有两种方法可以做到这一点:

  • 使用命名参数,如中所述

  • 使类成员接受结构作为参数:

    type EmployeeName =
       struct 
          val firstName: string
          val lastName: string
       end 
    
    member this.createEmployee2(employeeName: EmployeeName) = ...
    
    // external code
    MyClass.createEmployee2 {firstName = "John"; lastName = "Smith"}
    MyClass.createEmployee2 {lastName = "Smith"; firstName = "John"}
    
  • 选择权在你;前者允许使用可选参数(考虑
    middleName
    saltation
    ),而后者允许将结构存储在一起(例如,如果需要进一步处理)


    编译以创建C#调用语义,名称同时出现在Visual Studio 2013中的C#和F#intellisense中。

    Communicate?XML注释,与C#或VB.Net一样。执行不知道……可能是某种使用度量单位的黑客行为?@ildjarn如果编译成DLL从C#使用,就不会真正起作用。@Dax:根据您的编辑编辑我的评论。@JohnPalmer有没有办法从C#使用它?现在,您知道Json.net是否会将这些类型序列化/反序列化为常规字符串,还是在序列化过程中添加了额外的内容?需要保持api兼容性。不,这很可能会有问题-如果我对这类东西有问题,我通常会定义DTO-抱歉,我不知道您需要它来处理序列化程序-要我删除答案吗?所以要提取字符串,我每次都必须进行
    匹配
    ,还是有快捷方式?通常快捷方式是在需要的地方解构/模式匹配-例如,F#中的
    let myFun(FirstName fn)=…
    ,您实际上不必在此处使用
    match
    ,因为这是唯一可能的方法-如果您愿意,您也可以向其添加
    成员
    函数/属性,但这不会从编译器中保证函数的用户根本不会扰乱顺序:)-但是,如果它对您有效,请注意;)@卡斯滕,我看到了你的解决方案的优势,如果我从头开始,但是在一个有兼容性问题的大项目中,这似乎是一个实用的短期解决方案。嘿,没问题——不管是什么工作(只要你玩得开心)现在我可以从我的c代码中清除doSomething.Invoke(firstArg)、Invoke(second)、Invoke(third)等了,Carsten玩得更开心了。感谢你的指针没有插入args;从C#调用时,差异非常明显。
    type EmployeeName =
       struct 
          val firstName: string
          val lastName: string
       end 
    
    member this.createEmployee2(employeeName: EmployeeName) = ...
    
    // external code
    MyClass.createEmployee2 {firstName = "John"; lastName = "Smith"}
    MyClass.createEmployee2 {lastName = "Smith"; firstName = "John"}
    
    abstract createEmployee: firstName:string * lastName:string -> Employee