Если вам любопытно, то, о чем вы здесь говорите, называется «полиморфизмом ранга К». См. Википедию . В вашем случае k = 2. Некоторые переводят:
Когда вы пишете
f[X](x : X) : X = ...
тогда вы говорите, что f имеет тип "forall X.X -> X"
То, что вы хотите для z, это тип "(forall Z.Z -> Z) -> Unit". Та дополнительная пара скобок - большая разница. С точки зрения статьи в Википедии, он ставит квалификатор forall перед 2 стрелками, а не просто 1. Переменная типа не может быть создана только один раз и перенесена, ее потенциально нужно создать для множества различных типов. (Здесь «создание экземпляра» не означает конструирование объекта, это означает присвоение типа переменной типа для проверки типа).
Как показывает ответ alexy_r, это можно кодировать в Scala, используя объекты, а не прямые типы функций, по существу, используя классы / признаки в качестве паренов. Хотя он, кажется, заставил вас немного повесить его с точки зрения включения его в исходный код, вот оно:
// это ваш код
object TypeExample {
def main(args: Array[String]):Unit = {
def f[X](x:X):X = x // parameterize fn
def v(f:Int=>Int):Unit = { } // function that operates on an Int to Int function
v(f) // applied, types correct
v(f[Int]) // appplied, types correct
def w[Z](f:Z=>Z,g:Double=>Double):Unit = {} // function that operates on two functions
w(f[Int],f[Double]) // works
// Это новый код
trait ForAll {
def g[X](x : X) : X
}
def z(forall : ForAll) = w(forall.g[Int], forall.g[Double])
z(new ForAll{def g[X](x : X) = f(x)})
}
}