F#:编写一个将任何类型的数组作为输入的函数

F#: Writing a function that takes any kind of array as input

我是编程新手,F# 是我的第一语言。

这是我的部分代码:

let splitArrayIntoGroups (inputArray: string[]) (groupSize: int) =
        let groups = new LinkedList<string[]>()
        let rec splitRecursively currentStartIndex currentEndIndex =
            groups.AddLast(inputArray.[currentStartIndex..currentEndIndex]) |> ignore
            let newEndIndex = Math.Min((inputArray.Length - 1), (currentEndIndex + groupSize))
            if newEndIndex <> currentEndIndex then
                splitRecursively (currentStartIndex + groupSize) newEndIndex
        splitRecursively 0 (groupSize - 1)
        groups

我希望这个函数能够接受任何类型的数组(包括我自己定义的类型)作为输入。我应该做哪些改变?

将函数签名中的 string[] 替换为 _[]

这已经得到回答,但这里你有一个不使用链表而只是列表数组的实现

let rec split<'T> (input: 'T array) size =
    let rec loopOn (tail : 'T array) grouped =
        let lastIndex = Array.length tail - 1
        let endindx = min (size - 1) lastIndex
        let arrWrapper = (fun e -> [|e|])
        let newGroup = tail.[0..endindx] 
                        |> List.ofArray
                        |> arrWrapper
                        |> Array.append grouped

        match tail with
            | [||] -> newGroup 
                       |> Array.filter (fun e -> List.length e > 0)
            | _ -> loopOn tail.[endindx + 1..] newGroup

    let initialState = [|List.empty<'T>|]
    loopOn input initialState

因为这是通用实现,所以您可以用不同的类型调用它

type Custom = {Value : int} 

let r = split<int> [|1..1000|] 10
let r2 = split<float> [|1.0..1000.0|] 10

let r3 = split<Custom> [|for i in 1..1000 ->
                            {Value = i}|] 10