scala中高阶多态的常见实践
发布时间:2020-12-16 08:52:18 所属栏目:安全 来源:网络整理
导读:我试图通过实现描述monad的非常基本的接口来掌握 scala中的高阶多态性,但是我遇到了一个我不太了解的问题. 我用C实现了相同的代码,代码如下所示: #include iostreamtemplate typename Tclass Value {private: T value;public: Value(const T t) { this-valu
我试图通过实现描述monad的非常基本的接口来掌握
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; } 当尝试使用scala执行相同操作时,我失败了: 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) } } 编译器抱怨: [raichoo@lain:Scala]:434> scalac highorder.scala highorder.scala:5: error: not found: value Container Container[A](a) ^ one error found 我在这做错了什么?似乎有一个我似乎不了解scala类型构造函数的基本概念. 问候, 解决方法
Scala中的Monad特征将声明如下:
trait Monad[M[_]] { def pure[A](a: => A): M[A] def bind[A,B](a: M[A],f: A => M[B]): M[B] } 请注意,它使用类型构造函数M [_]进行参数化.括号中的下划线表示M是类型的类型构造函数(* – > *)(即M采用某种类型A来构造类型M [A]).您的身份monad实例将按如下方式编写: class Value[A](a: => A) { lazy val value = a } implicit val identityMonad = new Monad[Value] { def pure[A](a: => A) = new Value(a) def bind[A,B](a: Value[A],f: A => Value[B]) = new Value(f(a.value).value) } 此定义使用by-name参数来实现惰性语义. Scalaz库提供了Monad和其他有用的高级类型类以及标准Java / Scala库的大量实例. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |