F# 抽象元组函数中的参数名
与之相关的是,如何使用C#风格的元组参数来实现这一点?所以如果我想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#使
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