Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Functional programming CPS合并排序导致堆栈溢出_Functional Programming_Ocaml - Fatal编程技术网

Functional programming CPS合并排序导致堆栈溢出

Functional programming CPS合并排序导致堆栈溢出,functional-programming,ocaml,Functional Programming,Ocaml,由于非尾部递归导致堆栈溢出,所以我使用continuations使大列表的排序变得可行 我以这种方式实现了排序(您可以在这里看到整个代码:) 然而,在指示的行中,我得到了堆栈溢出。 我做错了什么?(@)OCaml的标准库不是尾部递归的merge函数使用了(@),这就是堆栈溢出的原因 list.mli说: val append : 'a list -> 'a list -> 'a list (** Catenate two lists. Same function as the in

由于非尾部递归导致堆栈溢出,所以我使用continuations使大列表的排序变得可行

我以这种方式实现了排序(您可以在这里看到整个代码:)

然而,在指示的行中,我得到了堆栈溢出。 我做错了什么?

(@)
OCaml的标准库不是尾部递归的<代码中的code>merge函数使用了
(@)
,这就是堆栈溢出的原因

list.mli
说:

val append : 'a list -> 'a list -> 'a list
(** Catenate two lists.  Same function as the infix operator [@].
   Not tail-recursive (length of the first argument).  The [@]
   operator is not tail-recursive either. *)
但不幸的是,这一事实并未写入
pervisives.mli中,其中
(@)
真正声明:

val ( @ ) : 'a list -> 'a list -> 'a list
(** List concatenation. *)
这不好:-(我已经在OCaml开发页面上提交了一个问题

我将
(@)
重新定义为
funxy->rev_append(revx)y
,然后您的代码运行时没有堆栈溢出。更优雅的是,您可以用
rev_append a l
替换
(reva)@l
这样的代码

在下一版本的OCaml中,mli将被注释为“非尾部递归”。OCaml标准库的
(@)
不是尾部递归。代码中的
merge
函数使用
(@)
,这是堆栈溢出的原因

list.mli
说:

val append : 'a list -> 'a list -> 'a list
(** Catenate two lists.  Same function as the infix operator [@].
   Not tail-recursive (length of the first argument).  The [@]
   operator is not tail-recursive either. *)
但不幸的是,这一事实并未写入
pervisives.mli中,其中
(@)
真正声明:

val ( @ ) : 'a list -> 'a list -> 'a list
(** List concatenation. *)
这不好:-(我已经在OCaml开发页面上提交了一个问题

我将
(@)
重新定义为
funxy->rev_append(revx)y
,然后您的代码运行时没有堆栈溢出。更优雅的是,您可以用
rev_append a l
替换
(reva)@l
这样的代码


pervisives.mli
中的p.S.
(@)
将被注释为“非尾部递归”在OCaml的下一个版本中。

快速排序过程是一个旧函数,在我必须重写的任何地方都没有使用。问题在于合并排序。我不明白。在您的代码中,
merge\u sort
使用
merge
,而
merge
使用
(@)
哪个是NTR。你试过我的修复方法吗?你是对的,我忘了我在merge中有附加项。谢谢!快速排序过程是一个旧函数,在我必须重写的任何地方都没有使用。问题是merge\u sort。我不明白。在你的代码中,
merge\u sort
使用
merge
,而
merge
使用
(@)
哪个是NTR。你试过我的修复方法吗?你是对的,我忘了我在合并中有附加项。谢谢!