ruby - 这些 'reverse' 和 'twist' 函数在 Ruby 中是如何工作的?(函数式编程)
问题描述
我fold
使用reduce
Ruby 中的方法重新定义了函数。
def fold(f, init, lst)
lst.reduce(init){|w, a| f.call(w, a)}
end
我有下面reverse
的twist
功能以及它们应该如何工作的示例。
reverse ‘(a b (c d) e)) --> (e (c d) b a)
def reverse(lst)
fold(lambda{|w, a| [a] + w}, [] of Any, lst)
end
怎么可能只用 ? 反转一个数组[a] + w
?是什么[] of Any
意思?
twist ‘(a b (c d) e)) --> (e (d c) b a)
def twist(lst)
fold(lambda{|w, a| ([a.kind_of?(Array) ? twist(a) : a]) + w}, [], lst)
end
对于twist
函数,我知道它的意思是“如果一个元素a
在 中Array
,它返回twist(a)
,它不在 中Array
,它只返回a
”。但我不明白这个算法是如何工作的..
解决方案
怎么可能只用 ? 反转一个数组
[a] + w
?是什么[] of Any
意思?
[] of Any
不是合法的 Ruby 语法,它是一个SyntaxError
. 由于代码甚至不是合法的语法,即它甚至不能被解析,所以分析它是如何运行的毫无意义,因为它根本无法运行。
对于
twist
函数,我知道这意味着“如果一个元素a
在Array
,
不,它的意思是“如果元素a
是一种Array
(或更准确地说,是一种 Array
)
它返回
twist(a)
,
不,它返回[twist(a)] + w
它不在
Array
,
不,再次,它的意思是“如果a
不是一个Array
.
它只返回
a
“。
不,它返回[a] + w
。
但我不明白这个算法是如何工作的..
a
是当前元素,w
是我们迄今为止建立的结果。如果a
是一个简单元素(不是Array
),我们返回[a] + w
,换句话说,我们移动a
到开头。
如果a
是一个Array
,我们首先调用twist
它,然后将它移到开头。
推荐阅读
- faunadb - 如何返回 FaunaDB 中的所有非空数据?
- python - 如何从数据库中的两个表中获取最新的 N 个条目?
- c++ - 开关/外壳中的准“如果”
- node.js - 如何使用 type-graphql 解析器函数获取 graphql 后端中的选定字段?
- r - 您可以重命名 R“格式表”中的列,而不会丢失以前应用的格式吗?
- r - 来自具有“字符”的数据帧条目列表的上样
- html - 使用 XSLT 和 XPath 计算元素最大属性值失败
- c - 归并排序算法问题:不同的输出
- javascript - 在javascript中自动重定向到另一个站点
- imagemagick - 如何使用 im4java 生成 3x3 瓦片?