如果我有一个功能
let rec function n =
if n<0 then []
else n-2 @ function n-2 ;;
我得到一个错误,说表达式function n-2
是一个int列表,但它期望一个int。
如何连接值以将所有n-2值作为列表返回到零以上?
我无法使用List
模块进行折叠。
感谢
答案 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,小于零。