问题描述
我有这两个功能...
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) );
当我尝试编译时,出现标题中指出的错误。为什么我不能这样打来比?当我从sml控制台以“ lessThan(4,2)(3,2)”运行它时,我得到了错误,这是正确的。
解决方法
您遇到的一个错误是由于将test
定义为不带参数的函数。
另一个错误是lessThan( (4,2) (3,2) )
的括号太多了。
这可能是由于以下错误观念造成的:“要调用函数,必须先命名函数,然后将参数放在括号中”。对于许多语言(例如C,Java和Python)都是如此,但SML并非如此。
在语法上测试此功能的有效方法是:
val test = lessThan (4,2)
避免这种错误的一种方法是:永远不要有多余的括号。如果括号实际上没有改变结果,则它是多余的。因此((1) + ((1)))
充满了多余的括号,而lessThan (4,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,d) =
real a / real b < real c / real d
您可能会说额外的一组括号会提高可读性:
fun lessThan (a,d) =
(real a / real b) < (real c / real d)
但是考虑到您不知道何时可以放置括号的问题,我认为在考虑完全添加可读性之前,永远不要放置不需要的括号是一个好习惯。