7

F Sharp サンプルでFluentValidationライブラリを使用しようとしていました。しかし、単純な C シャープ コードを F シャープ コードに変換することさえできないため、行き詰まりました。

しかし、この素晴らしいライブラリは、プログラミング側の機能的なビットを CSharp に持ち込もうとしているだけなので、これを使用する代わりに、FSharp のみで独自のライブラリを作成する必要があると考えました。それは簡単で適切な方法です。

ということで、どちらがいいかという意見が欲しいです。誰かがこのための FSharp サンプルを作成できれば、それは素晴らしいことです。私は主にC#で流暢なライブラリを使用しているため、学習目的のためだけです。そして、私は F# でそれらを使用するのが好きです。

4

1 に答える 1

9

F# は流暢な DSL をサポートしており、流暢な API を備えた F# ライブラリがいくつかあります。F# の型システムは C# のものとは少し異なり、流暢な API を使用するとほとんどの違いが現れますが、それでも次のように動作します。

#r @"C:\Users\Ramon\Downloads\FluentValidation\FluentValidation\FluentValidation.dll"

open System
open FluentValidation

type Customer =
    { Surname : string
      Forename : string
      Company : string
      Discout : int
      Address : string
      Postcode : string
      Discount : int
      HasDiscount : bool }

type IRuleBuilder<'T,'Property> with
    member __.Ignore = ()

type CustomerValidator =
    inherit AbstractValidator<Customer>

    new () =
        let beAValidPostcode postcode = true
        base.RuleFor(fun customer -> customer.Surname).NotEmpty().Ignore
        base.RuleFor(fun customer -> customer.Forename).NotEmpty().WithMessage("Please specify a first name").Ignore
        base.RuleFor(fun customer -> customer.Company).NotNull().Ignore
        base.RuleFor(fun customer -> customer.Discount).NotEqual(0).When(fun customer -> customer.HasDiscount).Ignore
        base.RuleFor(fun customer -> customer.Address).Length(20, 250).Ignore
        base.RuleFor(fun customer -> customer.Postcode).Must(beAValidPostcode).WithMessage("Please specify a valid postcode").Ignore
        { }
于 2013-03-24T08:39:27.997 に答える