如何在OCaml中连接列表值

时间:2014-04-10 03:45:36

标签: ocaml

如果我有一个功能

let rec function n = 
   if n<0 then [] 
   else n-2 @ function n-2 ;;

我得到一个错误,说表达式function n-2是一个int列表,但它期望一个int。

如何连接值以将所有n-2值作为列表返回到零以上?

我无法使用List模块进行折叠。 感谢

2 个答案:

答案 0 :(得分:1)

您的标题询问如何连接列表,但您的问题似乎有所不同。

要连接列表,您可以使用@运算符。在许多情况下,依赖于此运算符的代码比它需要的速度慢(以后需要注意的事项: - )。

以下是我给你的代码看错的一些事情:

一个。您无法命名函数function,因为function是OCaml中的关键字。

湾如果您使用@运算符,则应该在其两侧都有列表。就像我所看到的那样,代码左边的东西不是列表。

℃。函数调用的优先级高于中缀运算符。因此myfun n - 2被解析为(myfun n) - 2。你可能想要更接近myfun (n - 2)的东西。

即使进行了这些更改,您的代码似乎也会生成一个相距2的整数列表,这不是您想要的。但是,我无法理解该函数究竟应该返回什么。

答案 1 :(得分:0)

似乎你没有连接列表,而是连接整数。这是由::运算符完成的。所以你的代码看起来像是:

     else (n-2)::(fun (n-2))

虽然如果输入负数,我可以看到此功能可能无法产生所需的输出。例如,如果您通过n = 1,则n-2将评估为-1,小于零。