Я пытаюсь понять более высокий порядок-полимофизм в scala, реализуя очень простой интерфейс, который описывает монаду, но я сталкиваюсь с проблемой, которую я действительно не понимаю.Обычная практика для более высокого порядка-полиморфизма в scala
Я реализовал то же самое с C++, и код выглядит следующим образом:
#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;
}
При попытке сделать то же самое с Скале я не:
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)
}
}
Компилятор жалуется:
[[email protected]:Scala]:434> scalac highorder.scala
highorder.scala:5: error: not found: value Container
Container[A](a)
^
one error found
Что я здесь делаю неправильно? Кажется, есть фундаментальная концепция, которую я, похоже, не понимаю о дизайнерах scala typeconstructors.
С уважением, raichoo
http://stackoverflow.com/questions/1992532/monad-trait-in-scala – missingfaktor
Спасибо, эта ссылка выглядит очень интересной, но на самом деле не отвечает на мой вопрос. Я не хотел ничего знать о монадах, мой вопрос касался полиморфизма типового конструктора. Хотя, похоже, это хорошо читается. :) – raichoo