Для функции с как минимум n
аргументами, я хочу повернуть первый аргумент так, чтобы он стал n
-м аргументом. Например ( в нетипизированном лямбда-исчислении):
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))))
и return Lam (b => Lam (c => Lam (a => Ap (Ap (a, b), c))))
, например.