我在SMLNJ中有这段代码:
val reduce = fn : C list -> C list * int
datatype C = R | G | B | Y | SR | SG | SB | SY | DR | DG | DB | DY | P | W | W';
fun exhaustiveReduce(cList)=
let
fun helper((cList, score), prevScore, flag)=
if (0 = score andalso flag = true) then
(cList,prevScore)
else
helper(reduce(cList), prevScore+score, true)
in
helper((cList, 0), 0, false)
end
当我尝试运行以下行时:
exhaustiveReduce ([B,B,B,G,G,G,G,Y,R,R,R,Y,Y,G,G,G])
我收到此错误:
我理解的意思是我正在尝试向函数发送一个参数
它不期望得到,但?.
是什么意思?我该如何解决?
P.S。我看了一下:What does 'int ?. tree' mean in an SML error message?但是没有发现它非常有用。
由于
答案 0 :(得分:1)
?.t
表示t
以某种方式超出了范围,例如因为它被新的定义所遮蔽(即使是相同的)。您可能已经多次在REPL中输入了类型C
的定义,而您的reduce
函数仍然引用了较旧的定义。只需重新输入依赖于C
的所有定义(如果你想进行更严肃的开发,还可以使用SML / NJ的编译管理器)。
PS:flag = true
相当于只说flag
。