gpt4 book ai didi

ocaml - 如何编写函数以在OCaml中创建列表的循环版本?

转载 作者:行者123 更新时间:2023-12-04 22:45:52 24 4
gpt4 key购买 nike

可以使用let rec创建无限的循环列表,而无需求助于可变引用:

let rec xs = 1 :: 0 :: xs ;;

但是,我可以使用相同的技术来编写一个接收有限列表并返回其无限循环版本的函数吗?我尝试写作
let rec cycle xs = 
let rec result = go xs and
go = function
| [] -> result
| (y::ys) -> y :: go ys in
result
;;

但是出现了以下错误

Error: This kind of expression is not allowed as right-hand side of `let rec'

最佳答案

您的代码有两个问题:

  • result = go xslet rec的非法格式
  • 该函数尝试通过某种计算创建一个循环,该循环陷入无限循环,从而导致堆栈溢出。

  • 上面的代码被编译器拒绝,因为您不能在 let rec的右侧写一个可能导致递归计算的表达式(请参阅 Limitations of let rec in OCaml)。

    即使您解决了该问题,仍然存在问题: cycle不能完成工作:
    let rec cycle xs =
    let rec go = function
    | [] -> go xs
    | y::ys -> y :: g ys
    in
    go xs;;

    cycle [1;2];;
    cycle [1;2]由于堆栈溢出而失败。

    在OCaml中, let rec仅在定义为“静态”且不执行任何计算时才可以定义循环结构。 let rec xs = 1 :: 0 :: xs就是这样一个示例: (::)不是函数,而是构造函数,它仅构造数据结构。另一方面, cycle执行一些代码执行以动态创建结构,并且它是无限的。恐怕您无法在OCaml中编写类似于 cycle的函数。

    如果要在数据中引入一些循环,例如OCaml中的 cycle,则可以使用惰性结构来防止立即无限循环(例如Haskell的惰性列表),或使用变体通过替换来构成循环。 OCaml的列表不是惰性的也不是可变的,因此您不能编写动态构造循环列表的函数。

    关于ocaml - 如何编写函数以在OCaml中创建列表的循环版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26475516/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com