首页 > 解决方案 > 这些 'reverse' 和 'twist' 函数在 Ruby 中是如何工作的?(函数式编程)

问题描述

fold使用reduceRuby 中的方法重新定义了函数。

def fold(f, init, lst)
    lst.reduce(init){|w, a| f.call(w, a)}
end

我有下面reversetwist功能以及它们应该如何工作的示例。

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”。但我不明白这个算法是如何工作的..

标签: rubyfunctional-programmingreversereduce

解决方案


怎么可能只用 ? 反转一个数组[a] + w?是什么[] of Any意思?

[] of Any不是合法的 Ruby 语法,它是一个SyntaxError. 由于代码甚至不是合法的语法,即它甚至不能被解析,所以分析它是如何运行的毫无意义,因为它根本无法运行

对于twist函数,我知道这意味着“如果一个元素aArray,

不,它的意思是“如果元素a 一种Array(或更准确地说,是一种 Array

它返回twist(a)

不,它返回[twist(a)] + w

它不在Array

不,再次,它的意思是“如果a 不是一个Array.

它只返回a“。

不,它返回[a] + w

但我不明白这个算法是如何工作的..

a是当前元素,w是我们迄今为止建立的结果。如果a是一个简单元素(不是Array),我们返回[a] + w,换句话说,我们移动a到开头。

如果a是一个Array,我们首先调用twist它,然后将它移到开头。


推荐阅读