首页 > 解决方案 > 在子句错误中找不到函数参数:运算符不是函数

问题描述

我有这两个功能...

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)”时,我得到了错误,这是正确的。

标签: sml

解决方案


您遇到的一个错误是由于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)

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


推荐阅读