При реализации алгоритмов в SML я часто задаюсь вопросом, есть ли простой способ сделать код, который значительно облегчает использование массивов. Например, если я определить функцию SML поменять местами 2 элемента в массиве, код ...Есть ли способ сделать обработку массивов в SML более приятной?
local open Array in
fun exch (a, i, j) =
let
val tmp = sub (a, i)
val _ = update (a, i, sub (a, j))
val _ = update (a, j, tmp)
in() end
end
То, что я хотел бы иметь более удобен, уборщик версии, как в этом Scala-сниппета .. .
def exch[T](a: Array[T], i: Int, j: Int) {
val tmp = a(i)
a(i) = a(j)
a(j) = tmp
}
Для чего-то простого, как замена 2 элементов в массиве, версия SML в порядке. Но как только алгоритмы становятся более сложными, код становится все более непонятным и запутывает основной алгоритм.
Несколько более сложный пример будет этот стек (реализован в виде перезначительном массива) ...
structure ArrayStack = struct
type 'a stack = ('a option array * (int ref)) ref
exception Empty
fun mkStack() = ref (Array.array (1, NONE), ref 0)
fun isEmpty (ref (_, ref 0)) = true
| isEmpty _ = false
fun resize (array as ref (xs, n), capacity) =
let
val length = Array.length xs
in
array := (Array.tabulate (
capacity,
fn i => if i < length then Array.sub (xs, i) else NONE
), n)
end
fun push (array as ref (xs, n : int ref), x) =
if Array.length xs = !n then (
resize (array, !n*2)
; push (array, x))
else (
Array.update (xs, !n, SOME x)
; n := !n+1)
fun pop (ref (xs, ref 0)) = raise Empty
| pop (array as ref (xs, n : int ref)) = let
val _ = (n := !n-1)
val x = Array.sub (xs, !n)
val _ = Array.update (xs, !n, NONE)
val q = (Array.length xs) div 4
val _ = if !n > 0 andalso !n = q then resize (array, q) else()
in
valOf x
end
end
По сравнению с реализацией Java в http://algs4.cs.princeton.edu/13stacks/ResizingArrayStack.java.html осуществления (особенно нажимной/поп) становится трудно читать ,
Как я могу сделать такой код более удобочитаемым?
Поскольку код работает, это, вероятно, лучше подходит для http://codereview.stackexchange.com/. –