Sml can';在子句中找不到函数参数错误:运算符不是函数

Sml can';在子句中找不到函数参数错误:运算符不是函数,sml,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) ); fun lessThan(a,b)(c,d)=如果((实a)/(实b))

我有这两个功能

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) );
fun lessThan(a,b)(c,d)=如果((实a)/(实b))<((实c)/(实d))则为真,否则为假;
乐趣测试=较少((4,2)(3,2));

当我试图编译时,我得到了标题中说明的错误。为什么我不能这样称呼lessThan?当我从sml控制台以“lessThan(4,2)(3,2)”的形式运行它时,我得到了false,这是正确的。

您遇到的一个错误是由于
test
被定义为没有参数的函数而导致的

另一个错误是
lessThan((4,2)(3,2))
的括号太多

这可能是因为误解“要调用函数,必须先命名函数,然后将参数放在括号中”。对于C、Java和Python等许多语言来说都是如此,但在SML中情况并非如此

测试此功能的语法有效方法是:

val test = lessThan (4,2) (3,2)
避免这种错误的一种方法是:永远不要有任何多余的括号。如果括号实际上没有改变结果,则括号是多余的。因此
((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;
你可以说,一组额外的括号可以提高可读性:

fun lessThan (a, b) (c, d) =
    (real a / real b) < (real c / real d)
fun lessThan(a,b)(c,d)=
(真实a/真实b)<(真实c/真实d)

但是考虑到你不知道什么时候可以放括号的问题,我认为在你考虑完全为了可读性而添加括号之前,永远不要放你不需要的括号是一个很好的练习。

我意识到如果我在fun test中放一个伪参数,我会消除第一个错误,例如:fun test L=lessThan((4,2)(3,2));不能定义在SML中不接受任何参数的函数。
fun lessThan (a, b) (c, d) =
    (real a / real b) < (real c / real d)