Crystal 中的递归过程
Recursive Proc in Crystal
在Crystal中是否可以递归处理?
类似于lambda in Ruby
我正在尝试在 Crystal 中做一个 y-combinator
,类似于 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)
}.()
据我所知,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
UPDATE:可以在 Crystal 中使用 uninitialized
关键字创建递归过程:
g = uninitialized Int32 -> Int32
g = ->(n : Int32) { n.zero? ? 1 : n * g.call(n - 1) }
g.call(5) # => 120
感谢@mgarciaisaia 的评论。
在Crystal中是否可以递归处理?
类似于lambda in Ruby
我正在尝试在 Crystal 中做一个 y-combinator
,类似于 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)
}.()
据我所知,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
UPDATE:可以在 Crystal 中使用 uninitialized
关键字创建递归过程:
g = uninitialized Int32 -> Int32
g = ->(n : Int32) { n.zero? ? 1 : n * g.call(n - 1) }
g.call(5) # => 120
感谢@mgarciaisaia 的评论。