我正在使用许多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并返回的粗暴解决方案起作用,但不确定的'依赖是一把双刃剑。
答案 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