通过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)
如何定义?
答案 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)
。一旦你想通过就很简单。