在scala

时间:2016-02-12 19:11:10

标签: scala functional-programming currying partial-application

我正在使用许多curried函数,采取类似的论点,但并不完全。出于这个原因,我发现有一种方法可以执行第n个参数的转置,应用和组合,以及“最终”结果。例如:

val f :X=>Y=>W=>Z
def compose1[A](w :A=>Y) :X=>A=>W=>Z
def transpose1 :X=>W=>Y=>Z
def apply1(y :Y) :X=>W=>Z

对于n的固定值,可以很容易地完成这样的事情:

implicit class Apply2[X, Y, Z](private val f :X=>Y=>Z) extends AnyVal {
    def transpose :Y=>X=>Z = { y :Y => x :X => f(x)(y) }
    def provide(y :Y) :X=>Z ={ x :X => f(x)(y) }
    def compose[A](y :A=>Y) : X=>A=>Z = { x :X => a :A => f(x)(y(a)) }
    def apply[A, B]()(implicit ev :Z <:< (A=>B)) :Apply3[X, Y, A, B] = new Apply3[X, Y, A, B]((x :X) => (y :Y) => ev(f(x)(y)))
}

但是我当然不欢迎复制和放弃这个类的22个版本的想法。对于类型类的最后一个参数,我也可以很容易地做到这一点, 但是,类似于scala的下划线符号部分应用非curry函数的解决方案使我无法解决。我觉得应该有可能实现以下目标:

val f :A=>B=>C=>D=>E=>F
val c = f()().compose( (x :X) => new C(x)) :A=>B=>X=>D=>E=>F
val t = f()().transpose :A=>B=>D=>C=>E=>F
val s = f()().set(new C()) :A=>B=>D=>E=>F

通过隐式转换为某些Apply,它提供了一个返回嵌套apply()实例的递归Apply方法。

当所有类型都已知时,转换为HList并返回的粗暴解决方案起作用,但不确定的'依赖是一把双刃剑。

1 个答案:

答案 0 :(得分:3)

Ok, my mind still itches but I finally got it! Most difficult programming task I did in a while, though. If anyone has suggestions for improvement (including naming, notation and generally syntax) I'm all ears.

team_games#show