在F语言中使用C#fluent库#

在F语言中使用C#fluent库#,c#,f#,fluentvalidation,c#-to-f#,C#,F#,Fluentvalidation,C# To F#,我试图在F夏普样本中使用库。但是我被卡住了,因为我甚至不能把一个简单的C代码转换成F代码 但后来我认为这个很棒的库只是试图将编程端的功能位引入CSharp,所以我不应该使用它,而应该只在FSharp中创建我自己的库。这将是一种简单而恰当的方式 所以,我需要一个意见,哪种方式更好。如果有人能为此创建FSharp示例,那将是非常棒的。这只是为了学习,因为我主要使用C#中的fluent库。我喜欢在F#中使用它们。F#支持fluent DSL,并且有几个F#库具有fluent API。F#的类型系统与C

我试图在F夏普样本中使用库。但是我被卡住了,因为我甚至不能把一个简单的C代码转换成F代码

但后来我认为这个很棒的库只是试图将编程端的功能位引入CSharp,所以我不应该使用它,而应该只在FSharp中创建我自己的库。这将是一种简单而恰当的方式

所以,我需要一个意见,哪种方式更好。如果有人能为此创建FSharp示例,那将是非常棒的。这只是为了学习,因为我主要使用C#中的fluent库。我喜欢在F#中使用它们。

F#支持fluent DSL,并且有几个F#库具有fluent API。F#的类型系统与C#的类型系统有点不同,大多数差异都是通过流畅的API弹出的,但这仍然有效:

#r@“C:\Users\Ramon\Downloads\FluentValidation\FluentValidation\FluentValidation.dll”
开放系统
开放式FluentValidation
类型客户=
{姓氏:string
名字:字符串
公司名称:string
折扣:整数
地址:string
邮政编码:string
折扣:整数
HasDiscount:bool}
带有
成员(忽略=()
类型CustomerValidator=
继承抽象验证器
新的()=
让beAValidPostcode postcode=true
base.RuleFor(有趣的客户->客户.姓氏).NotEmpty().Ignore
base.RuleFor(fun customer->customer.Forename).NotEmpty().WithMessage(“请指定名字”)。忽略
base.RuleFor(fun customer->customer.Company).NotNull().Ignore
base.RuleFor(乐趣客户->客户.折扣).NotEqual(0).何时(乐趣客户->客户.折扣).忽略
base.RuleFor(fun customer->customer.Address).长度(20250).忽略
base.RuleFor(fun customer->customer.Postcode).Must(beAValidPostcode).WithMessage(“请指定有效的邮政编码”)。忽略
{ }

一种可能的方法,而不是从头重写,是在库的顶部编写一个F#DSL,就像FsUnit为NUnit所做的那样。@Mathias我曾经尝试过,但我仍然在FSharp中迈出了一小步,所以所有lambda表达式在FSharp interactive中对我来说都是陌生的。如果您能在FSharp中提供FluentValidation代码的示例,那就太好了。Ramon Snir的回答展示了在F#中使用FluentValidation库的一种实用方法(我可能会将Ignore扩展名改为End)。Mauricio Scheffer有一些很棒的基于F#(和C#)的验证示例:以及new/then,您也可以通过base关键字引用验证器,请参阅。请注意,如上所示,不再需要使用引号,因为F#3支持LINQ表达式。@PhillipTrelford您当然是对的,我的代码基于我的一个旧脚本,它更复杂,因此需要新的/then。编辑以简化特定场景。是-终于不需要报价了@PhillipTrelford-等等,你是在告诉我,例如,
fun customer->customer.name在
base.RuleFor(fun customer->customer.name)中被隐式捕获为LINQ表达式吗
?@StephenSwensen绝对在F#3中LINQ表达式按照C#3之后的表达式隐式工作:)这还意味着您可以使用其他基于LINQ表达式的C#库,如@PhillipTrelford-neat!不幸的是,我还没有找到时间真正探索所有新的F#3.0特性,很高兴了解到这一点。