Estoy tratando de captar el polimorfismo de orden superior en Scala implementando una interfaz muy básica que describe una mónada pero me encuentro con un problema que realmente no entiendo.Práctica común para el polimorfismo de orden superior en scala
que implementan la misma con C++ y el código es el siguiente:
#include <iostream>
template <typename T>
class Value {
private:
T value;
public:
Value(const T& t) {
this->value = t;
}
T get() {
return this->value;
}
};
template < template <typename> class Container >
class Monad {
public:
template <typename A> Container<A> pure(const A& a);
};
template <template <typename> class Container>
template <typename A>
Container<A> Monad<Container>::pure(const A& a) {
return Container<A>(a);
}
int main() {
Monad<Value> m;
std::cout << m.pure(1).get() << std::endl;
return 0;
}
Al tratar de hacer lo mismo con Scala fallo:
class Value[T](val value: T)
class Monad[Container[T]] {
def pure[A](a: A): Container[A] =
Container[A](a)
}
object Main {
def main(args: Array[String]): Unit = {
val m = new Monad[Value]
m.pure(1)
}
}
El compilador se queja de:
[[email protected]:Scala]:434> scalac highorder.scala
highorder.scala:5: error: not found: value Container
Container[A](a)
^
one error found
¿Qué estoy haciendo mal aquí? Parece que hay un concepto fundamental que no parece entender sobre los constructores tipo scala.
Saludos, raichoo
http://stackoverflow.com/questions/1992532/monad-trait-in-scala – missingfaktor
Gracias, ese enlace parece muy interesante pero realmente no responde mi pregunta. No quería saber nada sobre las mónadas, mi pregunta era sobre el polimorfismo constructor de tipos. A pesar de que parece una buena lectura. :) – raichoo