F# 序列和 array2d 转换
F# sequence and array2d conversion
我正在创建一个函数,将一个 Array2D 的正方形转换为一个字符串,然后将该字符串保存到一个文件中。此外,我还创建了一个加载函数,它将从文件中获取一个字符串并将该字符串转换为 Array2D。
方块看起来像: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 中不存在合适的函数,则首先转换为序列,然后使用合适的函数从那里开始。
方块位于一个 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()
要按照您描述的方式将数字数组转换为字符串,请使用 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]
。因此,您可能需要想出某种定界符或其他方式来以文本形式构建数据。
这引出了我的下一点:通常,您不应该发明 encodings/serialization 格式(除非是练习),而是使用现有格式,例如 JSON、XML,或 YAML(我最喜欢的是 JSON)。有现成的库可以在一次调用中为您完成 serialization/deserialization。
例如,查看 JSON.NET:
let json = JsonConvert.SerializeObject( gameBoard )
// Here, I assume that typeof<gameBoard> = "Square list list"
let board = JsonConvert.DeserializeObject<Square list list>( json )
我正在创建一个函数,将一个 Array2D 的正方形转换为一个字符串,然后将该字符串保存到一个文件中。此外,我还创建了一个加载函数,它将从文件中获取一个字符串并将该字符串转换为 Array2D。
方块看起来像: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 中不存在合适的函数,则首先转换为序列,然后使用合适的函数从那里开始。
方块位于一个 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()
要按照您描述的方式将数字数组转换为字符串,请使用 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]
。因此,您可能需要想出某种定界符或其他方式来以文本形式构建数据。
这引出了我的下一点:通常,您不应该发明 encodings/serialization 格式(除非是练习),而是使用现有格式,例如 JSON、XML,或 YAML(我最喜欢的是 JSON)。有现成的库可以在一次调用中为您完成 serialization/deserialization。
例如,查看 JSON.NET:
let json = JsonConvert.SerializeObject( gameBoard )
// Here, I assume that typeof<gameBoard> = "Square list list"
let board = JsonConvert.DeserializeObject<Square list list>( json )