了解Gen.unit(x)

时间:2013-11-17 13:56:45

标签: scala monads

通过Functional Programming in Scala,本书显示Gen Monad定义。据我所知,Gen是一个ScalaCheck特征。

val genMonad = new Monad[Gen] {
    def unit[A](a => A): Gen[A] = Gen.unit(a)
    def flatMap[A, B](ma: Gen[A])(f: A => Gen[B]) = 
        ma.flatMap(f)
}

我认为OptionMonad.unit定义为Some(a),但我不理解Gen.unit(a)

Gen.unit(a)如何定义?

1 个答案:

答案 0 :(得分:2)

Gen[A]只是一个可以重复调用以提供A类型实例的对象。这些“生成器”用于驱动ScalaCheck自动化测试框架,该框架允许程序员指定给定类型的对象的属性,然后重复生成该类型的实例并检查这些属性。 Gen形成一个monad,也就是说它支持“unit”和“bind”的操作,在互联网上可以找到大约数十亿个教程。 Scala的monad惯用语有点不一致,因为monad类型有bind的标准方法,称为flatMap,但unit没有。{1}}。这是因为Scala是面向对象的,unit不接受它的monad对象,而是返回一个,所以将unit作为基础类的方法没有任何意义。相反,大多数Scala monad隐含unit方法,通常作为monad类型的单元素构造函数。

因此,除了背景之外,unit的{​​{1}}是什么。好吧,它需要将类型为Gen[A]的对象作为参数,然后允许重复生成A类型的对象。由于A几乎可以成为任何东西,因此我们只能提出一件符合这项法案的事情。 A必须是一个无聊的生成器,它会重复返回unit(a)。一旦你想通过就很简单。