首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在做了一些工作后使函数返回自己

在做了一些工作后使函数返回自己
EN

Stack Overflow用户
提问于 2022-10-18 20:35:01
回答 2查看 74关注 0票数 3
代码语言:javascript
运行
复制
let log x = print_int x; log ;;

log 111 222;;

我期望log打印111并返回自身,然后在第二个调用中打印222,但是它不能像预期的那样工作,而是得到一个错误消息。为什么?如何使它像预期的那样工作?

我也尝试过rec,但没有结果。

代码语言:javascript
运行
复制
File "./hello.ml", line 3, characters 8-11:
3 | log 111 222;;
            ^^^
Error: This expression has type int but an expression was expected of type
         float
EN

回答 2

Stack Overflow用户

发布于 2022-10-18 20:48:20

如果你尝试这个:

代码语言:javascript
运行
复制
let log x = print_int x; log

您正在返回已经存在的log,它的类型为float -> float,因此类型不匹配。

如果你尝试:

代码语言:javascript
运行
复制
let rec log x = print_int x; log

类型系统变得混乱了。你的log拿着int回来了..。一个函数,它接受一个int,并返回一个接受int并返回.

这种递归不起作用。

..。除非您启用递归类型。

代码语言:javascript
运行
复制
% ocaml -rectypes
OCaml version 4.14.0
Enter #help;; for help.

# let rec log x = print_int x; log;;
val log : int -> 'a as 'a = <fun>
# log 222 111;;
222111- : int -> 'a as 'a = <fun>

回答了为什么默认情况下不打开此选项的OP's next question详细信息。

票数 8
EN

Stack Overflow用户

发布于 2022-10-18 20:49:49

除非您将log声明为递归函数,否则它的返回值将是其他函数,即log的前面定义。实际上,log是一个接受浮动值并返回浮动值的函数。

如果您确实将log声明为递归的,那么您将有进一步的问题。特别是,您的函数将具有递归类型。您可以使用-rectypes标志使其工作。

(我会更详细地解释,但克里斯在我写这篇文章时给出了一个很好的解释。)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74117157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档