【问题标题】:How to use WhenAnyValue and ToProperty with F#?如何在 F# 中使用 WhenAnyValue 和 ToProperty?
【发布时间】:2017-11-26 06:27:55
【问题描述】:

我是 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

我收到了这个错误:

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

【问题讨论】:

  • 哪一行出现错误?您可以尝试将其拆分为单独的语句以缩小范围吗?
  • 好吧,这不是同一个代码

标签: xamarin f# reactiveui c#-to-f#


【解决方案1】:

这是因为:

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

【讨论】:

  • 太棒了!非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-23
  • 2019-08-14
  • 2018-01-04
  • 2019-01-19
  • 2021-09-23
  • 2015-06-27
  • 1970-01-01
相关资源
最近更新 更多