Control.Print.printDepth := 20;
val arr = Array.array(10,0)
fun Ping (arr, _, [], _) = true
|Ping (arr, 0, (x::xs), ping_list) = Ping(arr, 1, xs, Pong(arr, ping_list, 10))
|Ping (arr, K, (x :: xs), ping_list) =
(if Array.sub(arr, x) = 0
then Array.update(arr, x, Array.sub(arr, x)+1)
else Array.update(arr, x, Array.sub(arr, x)+1);
if Array.sub(arr, x)-1 < 1
then Ping(arr, (K-1), xs, (x::ping_list))
else Ping(arr, K, xs, (x::ping_list)))
and Pong(arr, [], _) = []
|Pong(arr, (x::xs), min) =
(if Array.sub(arr, x) >= 1
then (Array.update(arr, x, Array.sub(arr, x)-1); [])
else [];
if Array.sub(arr,x) + 1 > 1
then if (length xs) < min then Pong(arr, xs, (length xs)) else Pong(arr, xs, min)
else xs);
val result = Ping(arr, 3, [0, 2, 4], []);
val it = arr;
Вывод:
val arr = [|0,0,0,0,0,0,0,0,0,0|] : int array
val Ping = fn : int array * int * int list * int list -> bool
val Pong = fn : int array * int list * int -> int list
val result = true : bool
val it = [|1,0,1,0,1,0,0,0,0,0|] : int array
Проблемы, которые я исправил до того, как смог его запустить:
- Типы возвращаемых значений Pong не согласованы (смешивание
()
и int list
) - Пинг и понг не были определены взаимно
- Смешанное определение карри и без карри / вызовы понга