Учитывая функцию с аргументами не менее n
, я хочу повернуть первый аргумент, чтобы он стал аргументом n
th. Например (в нетипизированном лямбда-исчислении):
r(λa. a) = λa. a
r(λa. λb. a b) = λb. λa. a b
r(λa. λb. λc. a b c) = λb. λc. λa. a b c
r(λa. λb. λc. λd. a b c d) = λb. λc. λd. λa. a b c d
И так далее.
Можете ли вы написать r
общим способом? Что, если вы знаете, что n >= 2
?
Здесь проблема, изложенная в Scala:
trait E
case class Lam(i: E => E) extends E
case class Lit(i: Int) extends E
case class Ap(e: E, e: E) extends E
Вращение должно принимать Lam(a => Lam(b => Lam(c => Ap(Ap(a, b), c))))
и возвращать Lam(b => Lam(c => Lam(a => Ap(Ap(a, b), c))))
, например.