can't find function arguments in clause Error: operator is not a function

can't find function arguments in clause Error: operator is not a function

我有这两个功能...

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)

避免此类错误的一种方法是:永远不要有任何多余的括号。如果括号实际上并没有改变结果,那么它就是多余的。所以 ((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)

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