Sml 调用另一个函数的函数

Sml 调用另一个函数的函数,sml,smlnj,Sml,Smlnj,假设我有两个SML函数Ping和Pong。我的代码是: 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)) //<-Problem is here | Ping (arr,K,(x :: xs),ping_list) = (if Array.sub(arr,x)=0

假设我有两个SML函数Ping和Pong。我的代码是:

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)) //<-Problem is here
   | 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)))



fun 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)
我也试着把乒乓球和乒乓球放在一个本地电话里,从电话里打乒乓球,但似乎不起作用。这怎么解决呢

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;
在运行之前已修复的问题:

  • Pong返回类型不一致(混合
    ()
    int list
  • 乒乓球和乒乓球没有相互定义
  • 混合咖喱和非咖喱定义/调用Pong

您使用的是什么版本的SML?我尝试运行您的代码,但它有多个问题阻止我运行它,
Ping
Pong
之间的相互递归以及缺少括号/分号是最大的问题。但是在修正了语法之后,这个程序对我来说似乎是可行的。我正在运行v110.85,你能发布适合你的代码吗?
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