Arraysort f#没有给出想要的类型

时间:2016-10-09 15:28:56

标签: sorting types f#

我创建了一个函数,通过首先将数组转换为列表来对数组进行排序(可能有点傻,但这是我的解决方案)。无论如何,它没有像其他类似的排序函数那样显示类型。我希望它看起来像sort : (’a [] -> ’a []) when ’a : comparison。我的去:

val arraySort : array:int [] -> int []
val it : unit = ()

1 个答案:

答案 0 :(得分:3)

第一步,删除所有类型注释;你通常只在需要的时候把它放进去(也就是说推断可以在没有一点帮助的情况下确定事情) 第二步使用模块内部的函数(这里是数组模块)那种方式(除其他事项外)推理可以使用这些函数的签名来确定数组是什么

这给出了:

let rec putNumber (thelist, value) =
  match thelist with
  | [] -> [value]
  | x :: xs -> if value <= x
               then [value; x] @ xs
               else x :: putNumber (xs, value)

let sort array =
  let rec sortList array blist index =
    let clist = putNumber (blist, Array.get array index)
    if index < Array.length array - 1
    then sortList array clist (index + 1)
    else clist
  List.toArray (sortList array [] 0)

也就是说,在不改变算法的情况下(尽管它并不是真正有效),事情可以用惯用语写出来:

let rec putNumber value = function
  | []                      -> [value]
  | x :: xs when value <= x -> [value; x] @ xs
  | x :: xs                 -> x :: putNumber value xs

let sort array =
  let len = Array.length array

  let rec sortList blist index =
    let value = Array.get array index
    let clist = putNumber value blist

    if index < len - 1
    then sortList clist (index + 1)
    else clist

  sortList [] 0
  |> List.toArray