记录转型

FRo*_*cha 4 f#

假设我有以下类型:

type Temp<'b,'c> =
   {
      A : string
      B : 'b
      C : 'c
      D : string
   }
Run Code Online (Sandbox Code Playgroud)

我想创建一个接收 Temp<string,string> 并输出 Temp<int,int> 的函数。我尝试了两种方法。最麻烦的(f1)有效,而最合乎逻辑(在我看来)则无效(f2)。

let f1 (r : Temp<string,string>) = //works
    {
       A = r.A
       B = r.B |> int
       C = r.C |> int
       D = r.D
    }

//doesn't work
let f2 (r : Temp<string,string>) = {r with B = r.B |> int; C = r.C |> int}
Run Code Online (Sandbox Code Playgroud)

是否有另一种方法可以构造这样的函数而不必重复主体中的所有字段?

小智 5

如前所述,您不能 (ATM) 使用该f2方法,但您可以简单地创建该方法的通用版本f1并使用它。

type Temp<'b,'c> = {
    A: string
    B: 'b
    C: 'c
    D: string
}

module Temp =
    let bind fB fC temp =
        {
            A = temp.A
            B = fB temp.B
            C = fC temp.C
            D = temp.D
        }

    let bind1 f = bind f f

let sTemp: Temp<string, string> = {
    A = "a"
    B = "b"
    C = "c"
    D = "d"
}

let iTemp: Temp<int, int> = sTemp |> Temp.bind int int   // with two separate functions for each generic field

let iTemp: Temp<int, int> = sTemp |> Temp.bind1 int      // with one function for both fields at once
Run Code Online (Sandbox Code Playgroud)