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