累加器
好吧,你快到了 - 首先你可能记得原来f
有 2 个参数 - 所以你可能应该添加另一个:
let fA i xs = ...
然后原始的变化i
随着它的进行 - 所以你也应该(将它添加到循环中):
let fA i xs =
let rec loop i acc = function
那么你就快到了 - 你只需loop
要用正确的参数调用,也许你有一个订单- 问题......继续尝试:D
啊是的 - 正如@Sehnsucht所说 - 你需要i+1
在那里的某个地方......记住为什么你应该带着i
你的loop
......
下一个提示
好的,您的问题似乎有些问题acc
-这里还有一行-您可以看到几乎没有任何变化:
let fA i xs =
let rec loop i acc = function
| ???
| x::xs -> loop (???) (???::acc) xs
???
显然你必须在这些地方插入(不同的)东西???
:D
如果您仍然遇到问题,您可以获得这样的编译版本:
let fA i xs =
let rec loop i acc = function
| [] -> acc
| x::xs -> loop i (x::acc) xs
loop i [] xs
当然这不会正常工作,但它会让你开始一些事情
继续
您可能已经猜到了——从基于累加器到基于延续的方式并没有什么不同(实际上,这可能更容易——取决于你对后向思维的习惯):
重新开始:
let fC i xs =
let rec loop i cont = function
如果您遇到问题,也许您应该让编译器为您提供一些帮助 - 为此添加如下类型cont
:
let fC i xs =
let rec loop i (cont : int list -> int list) = function
现在请记住,您必须在进行过程中创建新的延续 - 就像(fun res -> ...something... |> cont)
作为新的延续传递一样。考虑一下我对列表的其余部分(你的)做我的事情res
的结果,那么它应该很容易。xs
对于第一个延续,您很可能根本不想做任何事情……但这几乎总是相同的,因此您可能会立即知道。
你的老师提出的一些刻薄的观点
[] -> [i]
可能很讨厌......是的,你现在错过了;) - 一旦你编译了一些东西(应该是你首先关心的)你会很快弄清楚我认为
i+x
和i+1
......不要混合不要忘记;)
PS:我不想过多地破坏您的作业-稍后我会将其变成完整的答案-但是对于单个评论IMO来说太多/不可读