tuples - 我试图在 Ocaml 上的列表中添加一个元组
问题描述
我试图在 for 循环中将类型为 (int*int) 的元组添加到列表中,但我收到一条错误消息:此表达式应具有类型单元。
这就是我现在所拥有的:
let addtuple k lst =
for i=0 to k - 1 do
let (n,j) =Scanf.scanf " %d %d" (fun a b->(a,b))
in
(n,j)::lst
done;;
解决方案
OCaml 的目的for
是做某事,而不是计算一个值。所以循环体应该是一个具有有用副作用的 OCaml 表达式(比如打印一个值)。出于这个原因,for
循环体应该具有 type unit
,用于没有有趣值的表达式的类型。但是你的循环有一个列表体。编译器(正确地)告诉您这表明有问题。
您的代码是假设表达式(n, j) :: lst
将更改 的值而编写的lst
。但这种情况并非如此。在像 OCaml 这样的函数式语言中,您无法更改变量的值。
如果你的函数应该返回一个列表,它不能基于一个for
循环,它总是返回()
(单元类型的唯一值)。它很可能应该基于折叠(在处理一系列输入时累积一个值)或您自己的递归函数。
推荐阅读
- python - 私人消息系统 Django
- go - 无需预编译 Go 代码即可将 protobuf 序列化消息转换为 JSON
- entity-framework - TimerTrigger 不注入 EF 数据库上下文
- fortran - 如何用隐含的do循环逐行编写矩阵?
- jenkins - jenkins:HTTP 请求插件返回状态 200 而不是内容
- javascript - 是否可以在 react-select 中同时选择和创建相同的值?
- c# - 仅用基对象的值覆盖派生对象的基类成员
- reactjs - 如何在我的 React 应用程序中为生产配置 Webpack?(Github 页面)
- r - 仅预处理(中心和比例)特定变量(数字变量)
- cypress - 观看赛普拉斯测试视频时出现空白页