【问题标题】:F# syntax to change a record with a function then update the new recordF# 语法使用函数更改记录,然后更新新记录
【发布时间】:2020-10-17 03:08:52
【问题描述】:

我正在学习 F#(慢慢地)。

我该如何解决这个问题?

解释:“reset m”初始化模型记录并返回一个新的模型记录。 "update msg m" 返回一个新的模型记录。

我在这里尝试对 SelectMsg 执​​行的操作是首先更新/重置“模型”m,然后设置 new 的属性 SelectedOutterRow模型(由reset产生)。

这失败了:

let update msg m =
      match msg with
      | SelectMsg rId -> 
            reset m |> { m with SelectedOutterRow = rId }

这样就成功了,只是返回了原来的non-reset模型

let update msg m =
      match msg with
      | SelectMsg rId -> 
            reset m |> ignore
           { m with SelectedOutterRow = rId }

在哪里

type Model =
      { OutterRows: OutterRow.Model list
        SelectedOutterRow: Guid option }

let reset m = 
      let rows = 
        m.OutterRows
        |> List.map (fun r -> OutterRow.reset r)
      { m with OutterRows = rows; SelectedOutterRow = None }

那么,简而言之,我如何编写 lambda 以首先重置模型,更新模型,最后返回新模型?

感谢您的帮助。

TIA

【问题讨论】:

  • { reset m with SelectedOutterRow = rId } 可能是你想要的。

标签: f#


【解决方案1】:

如果您更喜欢将“步骤”放在您的面前,您可以为重置记录命名,以便您可以参考它。在 F# 中给事物命名的方法是 let 关键字:

| SelectMsg rId ->
    let r = reset m
    { r with SelectedOutterRow = rId }

或者您可以跳过名称并在一个表达式中完成所有操作:

| SelectMsg rId ->
    { reset m with SelectedOutterRow = rId }

【讨论】:

    【解决方案2】:

    问题中的代码不起作用的原因是reset m 不会更改m。相反,它会返回一条新记录。

    写入{ reset m with SelectedOutterRow = rId } 因此需要m,将其传递给reset 函数,该函数返回一条新记录。 with 语句获取这条新记录,并返回另一条新记录,其中SelectedOutterRow 已设置为rId

    因此,任何现有记录都不会发生突变 - 默认情况下,F# 不允许突变。在每种情况下,您都有一个返回新记录的表达式。

    【讨论】:

      猜你喜欢
      • 2012-11-21
      • 1970-01-01
      • 1970-01-01
      • 2022-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多