为什么这个函数挂了 REPL?

凯文梅雷迪思

使用 Idris进行测试驱动开发的第 9 章介绍了以下数据类型和removeElem函数。

import Data.Vect

data MyElem : a -> Vect k a -> Type where
   MyHere  : MyElem x (x :: xs)
   MyThere : (later : MyElem x xs) -> MyElem x (y :: xs)

-- I slightly modified the definition of this function from the text.
removeElem : (value : a) -> (xs : Vect (S n) a) -> (prf : MyElem value xs) -> Vect n a
removeElem value (value :: ys) MyHere         = ys
removeElem value (y :: ys)    (MyThere later) = removeElem value (y :: ys) (MyThere later)

以下工作:

*lecture> removeElem 1 [1,2,3] MyHere
[2, 3] : Vect 2 Integer

但是,以下调用在几分钟后仍在运行:

*lecture> removeElem 2 [1,2,3] (MyThere MyHere)

为什么这个,我假设,编译这么慢?

仙人掌

removeElem阅读的第二种情况

removeElem value (y :: ys)    (MyThere later) = removeElem value (y :: ys) (MyThere later)

右侧与左侧完全相同;所以你的递归发散了。这就是评估挂起的原因。

请注意,如果您声明removeElem应该为全部,则 Idris 会发现此错误

total removeElem : (value : a) -> (xs : Vect (S n) a) -> (prf : MyElem value xs) -> Vect n a
removeElem value (value :: ys) MyHere         = ys
removeElem value (y :: ys)    (MyThere later) = removeElem value (y :: ys) (MyThere later)

这导致编译时错误

RemoveElem.idr 第 9 行第 0 行:

Main.removeElem 由于递归路径,可能不是全部 Main.removeElem

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么在lein repl中运行函数时得到FileNotFoundExpection?

来自分类Dev

为什么这个使用 BPF 和 RAW SOCKET 的程序就挂了?

来自分类Dev

Clojure REPL和Scala REPL有什么区别?

来自分类常见问题

为什么在使用()调用Node.js REPL中的函数起作用?

来自分类Dev

为什么Python repl为None打印不同的东西?

来自分类Dev

为什么Clojure数字在REPL中以“ N”结尾?

来自分类Dev

为什么不能在Deno REPL内导入模块?

来自分类Dev

为什么不能在节点REPL中打开严格检查?

来自分类Dev

为什么Clojure数字在REPL中以“ N”结尾?

来自分类Dev

为什么Python repl为None打印不同的东西?

来自分类Dev

Clojure:使用REPL中的库函数

来自分类Dev

在REPL上评估已编译的ClojureScript函数

来自分类Dev

在Clojure REPL中引用无界函数

来自分类Dev

Clojure:使用REPL中的库函数

来自分类Dev

在REPL上评估已编译的ClojureScript函数

来自分类Dev

如何在REPL中打开函数的文档?

来自分类Dev

无法在 REPL 中运行 Curried 函数

来自分类Dev

为什么我的程序挂了

来自分类Dev

(源)在Clojure中为REPL定义的函数提供了“未找到”

来自分类Dev

是否可以从Repl的:reload中排除函数/名称空间?

来自分类Dev

如何在匿名函数中应用node.js REPL?

来自分类Dev

如何在Elm repl中查找函数类型

来自分类Dev

LightTable REPL返回nil而不是函数返回值

来自分类Dev

re.sub repl函数返回\ 1不会替换组

来自分类Dev

LightTable REPL返回nil而不是函数返回值

来自分类Dev

相当于R ls()函数的Scala REPL

来自分类Dev

是否可以从Repl的:reload中排除函数/名称空间?

来自分类Dev

Node.js REPL 函数文档字符串

来自分类Dev

Scala控制台中的repl sync是什么?

Related 相关文章

热门标签

归档