gpt4 book ai didi

crystal-lang - Crystal中的递归过程

转载 作者:行者123 更新时间:2023-12-04 14:09:09 27 4
gpt4 key购买 nike

递归过程在 Crystal 中是可行的吗?

类似 lambda in Ruby

我正在尝试做一个 y-combinator在 Crystal 中,类似于 Ruby 之一:

puts -> {
fact_improver = ->(partial) {
-> (n) { n.zero? ? 1 : n * partial.(n-1) }
}
y = ->(f) {
->(x) { f.(->(v) { x.(x).(v) }) }.(
->(x) { f.(->(v) { x.(x).(v) }) }
)
}
fact = y.(fact_improver)
fact = fact_improver.(fact)
fact.(100)
}.()

以上代码取自 Y Not- Adventures in Functional Programming

最佳答案

据我所知,Crystal 没有递归过程。但是要创建 Y 组合器,您不需要递归过程。实际上,根据definition :

In functional programming, the Y combinator can be used to formally define recursive functions in a programming language that doesn't support recursion.



这是使用 recursive types 在 Crystal 中编写的 Y 组合器示例:
alias T = Int32
alias Func = T -> T
alias FuncFunc = Func -> Func
alias RecursiveFunction = RecursiveFunction -> Func

fact_improver = ->(partial : Func) {
->(n : T) { n.zero? ? 1 : n * partial.call(n - 1) }
}

y = ->(f : FuncFunc) {
g = ->(r : RecursiveFunction) { f.call(->(x : T) { r.call(r).call(x) }) }
g.call(g)
}

fact = y.call(fact_improver)
fact = fact_improver.call(fact)
fact.call(5) # => 120

更新 :可以使用 uninitialized 在 Crystal 中创建递归过程关键词:
g = uninitialized Int32 -> Int32
g = ->(n : Int32) { n.zero? ? 1 : n * g.call(n - 1) }
g.call(5) # => 120

感谢@mgarciaisaia 的评论。

关于crystal-lang - Crystal中的递归过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45237446/

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