如何在 F# 中使用 WhenAnyValue 和 ToProperty?

How to use WhenAnyValue and ToProperty with F#?

我是 F# 和 reactiveui 的新手,有人可以帮我将以下 C# 代码翻译成 F#

this.WhenAnyValue(e => e.Username, p => p.Password,
    (emailAddress, password) => (!string.IsNullOrEmpty(emailAddress)) && !string.IsNullOrEmpty(password) && password.Length > 6)
    .ToProperty(this, v => v.IsValid, out _isValid);

这是我试过的方法,虽然我不知道这样对不对

this.WhenAnyValue(toLinq <@ fun (vm:LoginViewModel) -> vm.Username @>, toLinq <@ fun (vm:LoginViewModel) -> vm.Password @>)
    .Where(fun (u, p) -> (not String.IsNullOrEmpty(u)) && (not String.IsNullOrEmpty(p)) && p.Length > 6)
    .Select(fun _ -> true)
    .ToProperty(this, (fun vm -> vm.IsValid), &_isValid) |> ignore

我收到了这个错误:

错误:连续的参数应该用空格或元组分隔,涉及函数或方法应用的参数应该用括号括起来

发生这种情况是因为:

not String.IsNullOrEmpty(u)

括号在 F# 中不像在 C# 中那样具有特殊含义。在 F# 中,它们只是括号,而不是调用方法的特殊语法。换句话说,上面的表达式等同于:

not String.IsNullOrEmpty u

我认为现在的问题应该很明显了:这看起来好像您是在用两个参数调用 not 函数,而您实际上是想这样做:

not (String.IsNullOrEmpty u)

或者这个:

not <| String.IsNullOrEmpty u

或者,您可以为此创建一个特殊函数:

let notEmpty = not << String.IsNullOrEmpty

// And then:
notEmpty u