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

问题描述

我有这两个功能...

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)

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...