F#等价的++运算符

N_A*_*N_A 4 f#

我正在将数组转换为记录类型.就像是:

let value = [|"1";"2";"3";"Not a number";"5"|]
type ValueRecord = {
  One: int32
  Two: int32
  Three: int32
  Four: string
  Five: int32 }

let convertArrayToRecord (x: string array) =
  { One = x.[0] |> Int.Parse
    Two = x.[1] |> Int.Parse
    Three = x.[2] |> Int.Parse
    Four = x.[3]
    Five = x.[4] |> Int.Parse }

let recordValue = convertArrayToRecord value
Run Code Online (Sandbox Code Playgroud)

这有效,但缺点是在数组中间添加一个值会导致手动编辑所有索引引用,如下所示:

let value = [|"1";"Not a number - 6";"2";"3";"Not a number";"5"|]
type ValueRecord = {
  One: int32
  Six: string
  Two: int32
  Three: int32
  Four: string
  Five: int32 }

let convertArrayToRecord (x: string array) =
  { One = x.[0] |> Int.Parse
    Six = x.[1]
    Two = x.[2] |> Int.Parse //<--updated index
    Three = x.[3] |> Int.Parse //<--updated index
    Four = x.[4] //<--updated index
    Five = x.[5] |> Int.Parse } //<--updated index

let recordValue = convertArrayToRecord value
Run Code Online (Sandbox Code Playgroud)

此外,它容易意外地使索引错误.

我想出的解决方案是:

let convertArrayToRecord (x: string array) =  
    let index = ref 0
    let getIndex () =
        let result = !index
        index := result + 1
        result
    { One = x.[getIndex ()] |> Int.Parse
      Six = x.[getIndex ()]
      Two = x.[getIndex ()] |> Int.Parse
      Three = x.[getIndex ()] |> Int.Parse
      Four = x.[getIndex ()]
      Five = x.[getIndex ()] |> Int.Parse }
Run Code Online (Sandbox Code Playgroud)

这是有效的,但我真的不喜欢ref cell,因为它不是并发的.有没有更好/更清洁的方法来实现这一目标?

hlo*_*hlo 5

您可以使用模式匹配.

let convertArrayToRecord = function
    | [|one; two; three; four; five|] ->
        {
            One = int one
            Two = int two
            Three = int three
            Four = four
            Five = int five
        }
    | _ ->
        failwith "How do you want to deal with arrays of a different length"
Run Code Online (Sandbox Code Playgroud)

向阵列添加另一个条目时,您可以通过编辑第一个匹配来调整它[|one; six; two; three; four; five|].

顺便说一句,对于像你在当前例子中使用的索引一样的可变索引,你可以通过使用mutable关键字来避免ref,就像这样;

let mutable index = -1
let getIndex =
    index <- index + 1
    index
Run Code Online (Sandbox Code Playgroud)

如果我们在getIndex函数中隐藏mutable

let getIndex =
    let mutable index = -1
    fun () ->
        index <- index + 1
        index
Run Code Online (Sandbox Code Playgroud)

  • @mydogisbox从F#4.0,你可以使用可变的,而不是REF(编译器将会弄清楚你的,所以它仍然会放在堆 - 一样的,如果你在代码中使用REF).见https://blogs.msdn.microsoft.com/fsharpteam/2014/11/12/announcing-a-preview-of-f-4-0-and-the-visual-f-tools-in-vs-2015 /,称为简化使用可变值的部分 (4认同)
  • 上攻做它通过模式匹配 - 如果你改变了数组的长度和不更新的模式,你会得到一个编译器警告,提醒你解决它. (2认同)