如何解决为什么我们不能用 Opal 中使用 <~> 的代码替换“many”的定义?
我有一个关于 https://github.com/pyrocat101/opal/blob/master/opal.ml 的问题。
在第 105 行,我用 many
替换了 let rec many x = option [] (x <~> many x);;
的定义。然后,我收到以下错误消息:
求值期间堆栈溢出(循环递归?)。
不过,这两个代码好像是一样的。为什么?
我使用的是 OCaml 4.12.0 版。
解决方法
OCaml 是一种热切的语言。因此在
let rec many x = option [] (x <~> many x)
一旦提供了参数 many x
,内部表达式 x
就会被完全评估。因此,评估 many x
需要评估 many x
和函数循环。
最小的解决方法是避免隐藏 many
的输入参数:
let rec many x input = option [] (x <~> many x) input
(换句话说,在急切和可变的语言中,无点风格并不是无后果的。)
由于这里的内部 many x
是一个闭包,它的执行将被暂停以打破循环。
同理,内联版本
let rec many x = option [] (x >>= fun r -> many x >>= fun rs -> return (r :: rs))
通过移动匿名函数 many x
中的内部表达式 fun r -> ...
获得相同的结果。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。