F#sequence和array2d转换

时间:2015-05-27 13:50:21

标签: arrays string f# converter

我正在创建一个函数将Squares的Array2D转换为字符串,然后将该字符串保存到文件中。此外,我还创建了一个加载函数,它将从文件中获取一个字符串并将该字符串转换为Array2D。

Squares看起来像:type Square = { x : int; y : int; number : int; optionList : int list },还有一些用于创建和操作的函数。

//Getter functions
let getNumber S = S.number
let getXpos S = S.x        
let getYpos S = S.y
let getSquareList S = S.optionList

// createSquare creates a Square at position x y
let createSquare x y = { x=x; y=y; number = 0; optionList = [1..9]}

// createSquareFromScratch creates a Square where you decide all parameters
let createSquareFromScratch x y num li = { x=x; y=y; number = num; optionList = li}

// modifiedSquare creates a Square based on an old square
let modifiedSquare x y S = { x=x; y=y; number = getNumber S; optionList = getSquareList S }

我要保存的Squares部分是数字和optionList,它将产生一个10元素的长字符串,其中数字首先是列表,然后是列表。列表长度可以是0到9个元素,因此如果列表短于9个元素,则其余部分可以填充0。例如5123900000,其中5是数字,1239是列表,00000是填充。

根据我的推理,函数应该以某种方式从array2d构建一个字符串,可能是通过使用内置的高阶函数,或者如果array2d中没有正确的函数,那么首先转换为序列,然后从那里使用适当的函数

Squares位于9x9大型Array2D中,它们从Array获取的顺序将是它们在稍后加载函数中加载的顺序(加载它们时将为它们提供适当的x和y值)。

如何将字符串转换为正方形的array2d和正方形的array2d转换为字符串?

(我有很多试用和错误代码无法正常工作,但大多数都是非常糟糕且非常明显的测试。)例如:

let loadGame (gameAsString : string) =
    let tmp = List.ofSeq (gameAsString) |> Seq.cast<Square> |> Seq.toArray
    Array2D.init 9 9 (fun i j -> modifiedSquare i j (tmp.[((i+1)*(j+1) - 1)]))

let rec gameBoardToString (gameBoard : Square[,]) =
    match gameBoard.[0,0] with
    | x -> x.number.ToString() + x.optionList.ToString() 

1 个答案:

答案 0 :(得分:1)

要按照您描述的方式将数字数组转换为字符串,请使用String.Join

let optionsToStr<'a> (opts: seq<'a>) = System.String.Join( "", opts )

> optionsToStr [0..9]
val it : string = "0123456789"
> optionsToStr [true;false]
val it : string = "TrueFalse"
然而,只有在你保证所有数字都在0..9的范围内时才能解析它,否则我无法判断"12"是否代表[1;2][12]。因此,您可能需要提出某种分隔符或以文本形式构建数据的其他方式。

这让我想到了下一点:通常,您不应该发明编码/序列化格式(除非它是一个练习),而是使用现有格式,例如JSON,XML或YAML(我最喜欢的是JSON)。那里有现成的库,可以在每个调用中为您进行序列化/反序列化。

例如,请查看JSON.NET

let json = JsonConvert.SerializeObject( gameBoard )

// Here, I assume that typeof<gameBoard> = "Square list list"
let board = JsonConvert.DeserializeObject<Square list list>( json )