Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Syntax 它适用于太多的论点;也许你忘了一个`';_Syntax_Syntax Error_Ocaml - Fatal编程技术网

Syntax 它适用于太多的论点;也许你忘了一个`';

Syntax 它适用于太多的论点;也许你忘了一个`';,syntax,syntax-error,ocaml,Syntax,Syntax Error,Ocaml,我正在尝试编写一个代码来计算列表的大小 以下是我所做的: let rec l = function | [] -> 0 | t::q -> 1 + l q print_int(l ([1;2;3;4])) 问题是它在说我: It is applied to too many arguments; maybe you forgot a `;'. 当我用双分号在l的定义末尾,它工作得很好,但我已经读过了就没有任何用处,因此我不明白为什么它会给我这个错误。下面是 pri

我正在尝试编写一个代码来计算列表的大小

以下是我所做的:

let rec l = function 
  | [] -> 0 
  | t::q -> 1 + l q


print_int(l ([1;2;3;4]))
问题是它在说我:

It is applied to too many arguments; maybe you forgot a `;'.
当我用双分号
l
的定义末尾,它工作得很好,但我已经读过了
就没有任何用处,因此我不明白为什么它会给我这个错误。

下面是

print_int(l [1;2;3;4])
是顶级表达式。此类表达式前面需要加上

;; print_int(l [1;2;3;4])
另一个选项是使此顶级表达式与绑定

let () = print_int(l [1;2;3;4])
以下

print_int(l [1;2;3;4])
是顶级表达式。此类表达式前面需要加上

;; print_int(l [1;2;3;4])
另一个选项是使此顶级表达式与绑定

let () = print_int(l [1;2;3;4])

解析代码时,解析器会一直前进,直到碰到
lq
。此时可能会有更多参数应用于函数l。所以解析器继续运行,它找到的下一个值是print_int。这会让你犯错误

解析器无法知道您已经完成了函数l的代码。在顶层,特殊标记
用于告诉解析器输入已经完成,它现在应该对代码进行求值。之后,它再次开始对剩余的输入进行配对

现在,为什么编译后的代码没有“;”代币

只是因为它不需要。在编译代码中,行
print\u int(l[1;2;3;4])
不是有效的输入。这将是您想要执行的语句,而函数式语言没有这样的东西。相反,
print_int(l[1;2;3;4])
是一个返回值()的表达式,在本例中,您必须告诉编译器如何处理该值。一个
let()=
告诉编译器将其与()匹配。而且
let…
还告诉编译器前面的
let rec l…
已经完成。所以没有特殊的
令牌


或者这样想:如果您的输入不是以let开头的,则在顶层有一个隐式的
let=
。这样,您只需键入某个表达式并查看其计算结果,而无需每次键入
let
。“;;”标记仍然意味着“立即求值”,并且仍然是必需的。

解析代码时,解析器会一直向前推进,直到到达
lq
。此时可能会有更多参数应用于函数l。所以解析器继续运行,它找到的下一个值是print_int。这会让你犯错误

解析器无法知道您已经完成了函数l的代码。在顶层,特殊标记
用于告诉解析器输入已经完成,它现在应该对代码进行求值。之后,它再次开始对剩余的输入进行配对

现在,为什么编译后的代码没有“;”代币

只是因为它不需要。在编译代码中,行
print\u int(l[1;2;3;4])
不是有效的输入。这将是您想要执行的语句,而函数式语言没有这样的东西。相反,
print_int(l[1;2;3;4])
是一个返回值()的表达式,在本例中,您必须告诉编译器如何处理该值。一个
let()=
告诉编译器将其与()匹配。而且
let…
还告诉编译器前面的
let rec l…
已经完成。所以没有特殊的
令牌


或者这样想:如果您的输入不是以let开头的,则在顶层有一个隐式的
let=
。这样,您只需键入某个表达式并查看其计算结果,而无需每次键入
let
。“;;”令牌仍然表示“立即评估”,并且仍然需要。

谢谢!你怎么知道这是一个顶级表达式?即使print_int有type unit,我们也有义务使用let()=?因为,例如,当执行模式匹配时,比如:let rec print_l=function |[]->print_int 0,所以这里我不使用语法let()=。。。直接使用print_int,我没有错,你使用了“let”作为“let rec print_l”。@GoswinvonBrederlow好的,谢谢!现在让我们假设我想使用print_l函数,我应该使用:let()=print_l m,还是直接使用:print_l m?您可以在…
中使用
let()=side\u effect()或
side\u effect()表达式内部。谢谢!你怎么知道这是一个顶级表达式?即使print_int有type unit,我们也有义务使用let()=?因为,例如,当执行模式匹配时,比如:let rec print_l=function |[]->print_int 0,所以这里我不使用语法let()=。。。直接使用print_int,我没有错,你使用了“let”作为“let rec print_l”。@GoswinvonBrederlow好的,谢谢!现在让我们假设我想使用print_l函数,我应该使用:let()=print_l m,还是直接使用:print_l m?您可以在…
中使用
let()=side\u effect()或
side\u effect()表达式内部。感谢您的回答,现在已经很清楚了。因此,每当我有一些函数“f”,如果我想使用f,我必须使用语法:let a=f。。。;对我来说,最奇怪的是,让a=。。。是说把a的值放进去…,所以当我做类似于让a=print_int 2;它不应该做任何事情。所以我不明白为什么它会计算表达式。在其他语言如C中,创建函数不会执行它
let
不会创建函数。它创造了价值。这意味着它会计算代码。现在
let f x=…
let f=function x->…
的语法糖,用于计算代码
function x->。