我正在尝试编写一个函数来返回一个动态类型的数组。这是我尝试过的一种方法的示例:
let rng = System.Random()
type ConvertType =
| AsInts
| AsFloat32s
| AsFloats
| AsInt64s
type InputType =
| Ints of int[]
| Float32s of float32[]
| Floats of float[]
| Int64s of int64[]
let genData : int -> int -> ConvertType -> InputType * int[] =
fun (sCount:int) (rCount:int) (ct:ConvertType) ->
let source =
match ct with
| AsInts -> Array.init sCount (fun _ -> rng.Next()) |> Array.map (fun e -> int e) |> Ints
| AsFloat32s -> Array.init sCount (fun _ -> rng.Next()) |> Array.map (fun e -> float32 e) |> Float32s
| AsFloats -> Array.init sCount (fun _ -> rng.Next()) |> Array.map (fun e -> float e) |> Floats
| AsInt64s -> Array.init sCount (fun _ -> rng.Next()) |> Array.map (fun e -> int64 e) |> Int64s
let indices = Array.init rCount (fun _ -> rng.Next sCount) |> Array.sort
source, indices
我遇到的问题是,当我使用该函数时,我需要数组是原始类型,例如 float32[] 而不是“InputType”。
我也尝试过通过内联函数创建的接口并使用泛型来做到这一点。我也无法让它按照我想要的方式工作,但我可能做错了。
编辑: 感谢您的出色回复,我今天必须尝试一下。我添加编辑是因为我解决了我的问题,尽管我没有按照我想要的方式解决它(即喜欢答案)。因此,对于那些可能会看这个的人来说,我做了以下事情:
let counts = [100; 1000; 10000]
let itCounts = [ 1000; 500; 200]
let helperFunct =
fun (count:int) (numIt:int) (genData : int -> int -> ('T[] * int[] )) ->
let c2 = int( count / 2 )
let source, indices = genData count c2
....
[<Test>]
let ``int test case`` () =
let genData sCount rCount =
let source = Array.init sCount (fun _ -> rng.Next())
let indices = Array.init rCount (fun _ -> rng.Next sCount) |> Array.sort
source, indices
(counts, itCounts) ||> List.Iter2 (fun s i -> helperFunct s i genData)
.....
然后每个进行中的测试用例将类似于:
[<Test>]
let ``float test case`` () =
let genData sCount rCount =
let source = Array.init sCount (fun _ -> rng.Next()) |> Array.map (fun e -> float e)
let indices = Array.init rCount (fun _ -> rng.Next sCount) |> Array.sort
source, indices
.....
但是,我问这个问题的全部原因是我试图避免为每个测试用例重写 genData 函数。在我的真实代码中,这个临时解决方案使我不必分解“helperFunct”中的一些东西。