gpt4 book ai didi

python - Ruby 中的一流函数

转载 作者:数据小太阳 更新时间:2023-10-29 07:49:43 24 4
gpt4 key购买 nike

我正在阅读这篇关于函数式编程 (https://codewords.recurse.com/issues/one/an-introduction-to-functional-programming) 的文章,并尝试使用 Ruby 进行练习。

一个练习定义了两个函数,零和一。 Zero 采用字符串参数并返回字符串索引 1 - 如果第一个字符为 0 则结束,One 执行相同的操作,但前提是第一个字符为 1。

以下是 ruby​​ 实现:

def zero(s)
if s[0] == "0"
return s[1..(s.length)]
end
end

def one(s)
if s[0] == "1"
return s[1..(s.length)]
end
end

该问题要求您编写一个名为 rule_sequence 的方法,给定一个字符串和一个函数数组,返回的结果是一次调用一个函数——在整个字符串中调用第一个函数,在该字符串的返回值上调用第二个函数,等等。如果在任何时候,其中一个函数返回 nil,则返回 nil。

Python 实现是:

def rule_sequence(s, rules):
if s == None or not rules:
return s
else:
return rule_sequence(rules[0](s), rules[1:])

但是,由于 Ruby 似乎不支持高阶函数,所以我能想到的最优雅的解决方案如下:

def rule_sequence(string, rules)
if rules.length == 0 or string.nil?
return string
else
return rule_sequence(rules[0].call(string), rules[1..rules.length])
end
end

puts rule_sequence('0101', [lambda { |s| zero(s) }, lambda { |s| one(s) }, lambda { |s| zero(s) } ])

谁能想出比传递或调用 lambda 更简洁的方法?

最佳答案

我将以此练习为契机展示 Ruby 如何支持高阶函数。

让我们退后一步,重写zero - one 函数。你会注意到他们有很多共同点。让我们尝试通过编写一个可以生成两者的 lambda 来利用它

tail_on_prefix = lambda {|prefix|
lambda {|str| str[1..-1] if str[0] == prefix}
}

我们现在可以轻松定义

zero = tail_on_prefix.("0")
one = tail_on_prefix.("1")

现在到 rule_sequence!

rule_sequence = lambda {|str, rules|
if (str.nil? or rules.empty?)
str
else
rule_sequence.(rules[0].(str), rules[1..-1])
end
}

现在调用 rule_sequence 看起来好多了,不是吗

rule_sequence.("100101", [one, zero, zero]) # => "101"

关于python - Ruby 中的一流函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29443728/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com