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

时间:2015-04-21 11:30:59

标签: arrays f#

我是编程新手,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

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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