sml - 在子句错误中找不到函数参数:运算符不是函数
问题描述
我有这两个功能...
fun lessThan (a, b) (c, d) = if ((real a) / (real b)) < ((real c) / (real d)) then true else false;
fun test = lessThan( (4,2) (3,2) );
当我尝试编译时,我得到标题中所述的错误。为什么我不能像这样调用 lessThan ?当我从 sml 控制台将它运行为:“lessThan (4,2) (3,2)”时,我得到了错误,这是正确的。
解决方案
您遇到的一个错误是由于test
被定义为没有参数的函数而引起的。
另一个错误是lessThan( (4,2) (3,2) )
括号太多。
这可能是由于“调用函数,必须先命名函数,然后将参数放在括号中”的误解造成的。对于 C、Java 和 Python 等许多语言来说都是如此,但在 SML 中并非如此。
测试此函数的语法有效方法是:
val test = lessThan (4,2) (3,2)
避免此类错误的一种方法是:永远不要有任何多余的括号。如果括号实际上并没有改变结果,则括号是多余的。So((1) + ((1)))
充满了多余的括号,而lessThan (4,2) (3,2)
没有多余的括号,因为它们都用于构造元组。
至于函数本身,您可以将其缩进以使其更易于阅读,并且您可以删除那些多余的括号:
fun lessThan (a, b) (c, d) =
if real a / real b < real c / real d
then true
else false;
另请注意,这if p then true else false
只是一种罗嗦的说法p
。
所以这个函数的一个更短的版本:
fun lessThan (a, b) (c, d) =
real a / real b < real c / real d
您可能会争辩说,额外的一组括号提高了可读性:
fun lessThan (a, b) (c, d) =
(real a / real b) < (real c / real d)
但是考虑到您不知道何时可以放置括号的问题,我认为在您考虑完全添加括号以提高可读性之前,永远不要放置任何您不需要的东西是一个很好的练习。