【发布时间】:2019-04-08 04:34:33
【问题描述】:
假设我有两个 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)
如果我用数组来调用 Ping,3:int,[1,2,3]:list,[] 它会给我不想要的输出。以同样的方式,如果我用数组调用 Pong,list,整数,它给了我想要的输出。在 ping 函数中,如果 K=0,我想调用 pong 函数(它修改数组)并递归调用 Ping 函数,但在参数 ping_list 中有 Pong 的结果(这是一个列表)但是运行这个给了我这个错误:
stdIn:27.40-27.73 Error: operator and operand do not agree [tycon mismatch]
operator domain: int array
operand: 'Z * 'Y * [int ty]
in expression:
Pong (arr,ping_list,10)
我也尝试将 Ping 和 Pong 放在本地并从内部调用 Ping,但它似乎不起作用。如何解决?
【问题讨论】:
-
您使用的是什么版本的 SML?我尝试运行您的代码,但它有多个问题阻止我运行它,
Ping和Pong之间的相互递归和缺少括号/分号是最大的。但是在修正了语法之后,这个程序似乎对我有用。 -
我正在运行 v110.85,您能否发布适合您的代码?