加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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类型构造函数的基本概念.

问候,
raichoo

解决方法

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库的大量实例.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读