首页 > 解决方案 > 我试图在 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;;

标签: tuplesocaml

解决方案


OCaml 的目的for做某事,而不是计算一个值。所以循环体应该是一个具有有用副作用的 OCaml 表达式(比如打印一个值)。出于这个原因,for循环体应该具有 type unit,用于没有有趣值的表达式的类型。但是你的循环有一个列表体。编译器(正确地)告诉您这表明有问题。

您的代码是假设表达式(n, j) :: lst将更改 的值而编写的lst。但这种情况并非如此。在像 OCaml 这样的函数式语言中,您无法更改变量的值。

如果你的函数应该返回一个列表,它不能基于一个for循环,它总是返回()(单元类型的唯一值)。它很可能应该基于折叠(在处理一系列输入时累积一个值)或您自己的递归函数。


推荐阅读