我的职能如下:
let extract n l =
let rec aux acc pro = function
|[] -> acc
|a::b -> if (List.length pro) = n then aux (pro::acc) [] (a::b) else aux acc (a::pro) b; aux acc (pro) b
in aux [] [] l
正如您在我的模式匹配中所看到的,在第二个测试的情况下,我调用了函数的两倍。有可能吗?
因此,有可能具有这样的功能:
let rec some_function = function
| [] ->[]
| a::b -> some_function b; some_function b (*so I am calling two times the function in a single test*)
我提出这个问题,是因为我在这里有以下警告:
File "main.ml", line 4, characters 48-72:
Warning 10: this expression should have type unit.
因此,在我调用两次递归函数的确切位置有一个问题。这可能是因为我使用的是;
,但在这种情况下,我如何分离这两个调用?
谢谢!
发布于 2018-10-05 11:22:57
若要添加到FlorianWeimer的答案,请提供有关您的错误消息的一些信息。
Warning 10: this expression should have type unit.
OCaml是强类型的。因此,如果一个函数返回一个整数或一个列表,而你没有对它做任何事情,它会想知道发生了什么,并警告你。
像print_int 5;
这样的函数调用返回()
,它的类型是unit
。这基本上意味着它什么也不返回,因为你不是调用它来计算什么,而是做一些事情。它已经做了那件事,现在它回来了,你继续前进。
但是像float_of_int 5;
这样的函数调用,它返回一个值(浮点5.0
)。你(可能)不是叫它做某事,而是为了计算某事,它返回的是你感兴趣的东西。像3+6;
这样的算术表达式也是如此,10;
、"abc";
或[];
等直接向上的值也是如此。
这就是为什么,如果您编写其中一个有值而不使用该值(在赋值中,或作为另一个函数的参数),OCaml警告您。它告诉你“我计算了一些我没有分配的东西,没有返回,也没有用它作为其他东西的参数。通常,unit
类型的东西是唯一这样的东西。你确定你的代码中没有错误吗?”
有时候你知道你在做什么,你不想听到这样的警告。在这种情况下,您可以调用ignore
函数。ignore
会拿走任何东西而忽略它,返回()
。例如,ignore 5;
或ignore (float_of_int 10);
不会抛出您将在5;
或float_of_int 10;
中得到的“这个表达式应该有类型单元”警告。
发布于 2018-10-05 10:36:37
从编译器接受它的意义上来说,这是可能的,但只有当您对结果做了一些事情(或者该函数有副作用)时,它才有意义。两个函数调用的典型示例是Fibonacci序列的递归计算:
let rec fib = function
| 0 -> 0
| 1 -> 1
| n -> fib (n - 1) + fib (n - 2)
https://stackoverflow.com/questions/52671366
复制