【发布时间】:2016-05-08 20:01:15
【问题描述】:
我正处于编程和 SML 的第一步,我正在尝试创建一个程序。事实上,发生了很多错误。
在这篇文章中我得到了错误:
操作符不是函数
我是函数式编程的新手,很难理解下面代码的逻辑。是否可以在“let”中使用多个“val”声明,并且在模式匹配中使用了let/val/in?
fun action(_,_,[]) = ([],[])
|action(cin,cout,h::[]) =
let
val (s1,d1,d2) = (pass_cout(pass_cin h cin) cout, #1 (find2digits((pass_cout(pass_cin h cin) cout))),#2 (find2digits((pass_cout(pass_cin h cin) cout))))
in
if (d1<>d2) then
(d1::[],[])
else ([],[])
end
|action (cin,cout,first::t) =
let
val s1 = pass_cout ((pass_cin first cin) cout)
val s2 = pass_cout (last_element t) cout (**)
val d1 = #1 find2digits(s2)
val d2 = #2 find2digits(s2)
val neo_in = produce_cin s1 s2 (**)
val neo_out = produce_cout s2
in
if (neo_in<2 andalso neo_out<2) then
(d1::action(neo_in,neo_out,cut (first::t)),d2::action(neo_in,neo_out,cut (first::t))) (**)
else ([],[])
end;
【问题讨论】:
-
您的代码包含对未定义函数的多个引用(例如
find2digits和pass_cout),因此很难说出任何有意义的内容,尤其是因为您的意图似乎不清楚。你想做什么?不过,我会这么说——当您在let内有多个val绑定时,它们需要用分号而不是换行符分隔。 -
@JohnColeman:声明之间的分号是可选的,在 let 绑定中也是如此。有点相关,表达式之间的分号运算符(SML 中唯一真正有用的分号)需要在它们周围加上括号,例如
(f x; ...; g y)除了在 let-bindings 内:let ... in f x; ...; g y end。这是为了用声明之间不太有用的分号来消除歧义。由于let ... in和end内不能直接声明(除非引入了内部 let 绑定),因此可以省略括号。 -
@SimonShine 你当然是对的。我知道但暂时忘记了。我查看了 Ullman,但他是那些经常使用分号的作者之一。
-
我怀疑这是因为您在定义
s1时将(pass_cin first cin)应用于cout。 -
非常感谢您的帮助。 pass_cin 和 pass_cout 有 2 个整数作为输入,它们的输出也是一个整数。所以我从 s1 的错误开始,说运算符不是函数
标签: operator-keyword sml