Scala PartialFunction可以是Monoid?
发布时间:2020-12-16 09:19:14 所属栏目:安全 来源:网络整理
导读:我以为 PartialFunction可以是 Monoid.我的思维过程是否正确? 例如, import scalaz._import scala.{PartialFunction = --}implicit def partialFunctionSemigroup[A,B]:Semigroup[A--B] = new Semigroup[A--B]{ def append(s1: A--B,s2: = A--B): A--B = s1
我以为
PartialFunction可以是
Monoid.我的思维过程是否正确?
例如, import scalaz._ import scala.{PartialFunction => -->} implicit def partialFunctionSemigroup[A,B]:Semigroup[A-->B] = new Semigroup[A-->B]{ def append(s1: A-->B,s2: => A-->B): A-->B = s1.orElse(s2) } implicit def partialFunctionZero[A,B]:Zero[A-->B] = new Zero[A-->B]{ val zero = new (A-->B){ def isDefinedAt(a:A) = false def apply(a:A) = sys.error("error") } } 但目前版本的Scalaz(6.0.4)不包括在内.有没有包含的东西的原因? 解决方法
让我们在这里发光不同.
部分函数[A,B]与A =>是同构的选项[B]. (实际上,为了能够检查是否定义了给定的A而不触发B的评估,则需要A => LazyOption [B]) 所以如果我们可以找到一个Monoid [A =>选项[B]]我们证明了你的断言. 给定Monoid [Z],我们可以形成Monoid [A => Z]如下: implicit def readerMonoid[Z: Monoid] = new Monoid[A => Z] { def zero = (a: A) => Monoid[Z].zero def append(f1: A => Z,f2: => A => Z) = (a: A) => Monoid[Z].append(f1(a),f2(a)) } 那么,如果我们使用Option [B]作为Z,我们有什么Monoid?斯卡拉兹提供三个.主要实例需要一个Semigroup [B]. implicit def optionMonoid[B: Semigroup] = new Monoid[Option[B]] { def zero = None def append(o1: Option[B],o2: => Option[B]) = o1 match { case Some(b1) => o2 match { case Some(b2) => Some(Semigroup[B].append(b1,b2))) case None => Some(b1) case None => o2 match { case Some(b2) => Some(b2) case None => None } } } 使用这个: scala> Monoid[Option[Int]].append(Some(1),Some(2)) res9: Option[Int] = Some(3) 但这不是组合两个选项的唯一方法.在这两种情况下,两个选项的内容不是附加两个选项,而是两个选项中的第一个或最后一个.两个触发器,我们创建一个独特的类型与技巧称为标签类型.这与Haskell的新型相似. scala> import Tags._ import Tags._ scala> Monoid[Option[Int] @@ First].append(Tag(Some(1)),Tag(Some(2))) res10: scalaz.package.@@[Option[Int],scalaz.Tags.First] = Some(1) scala> Monoid[Option[Int] @@ Last].append(Tag(Some(1)),Tag(Some(2))) res11: scalaz.package.@@[Option[Int],scalaz.Tags.Last] = Some(2) 选项[A] @@首先,通过Monoid附加,使用与您的示例相同的或者Else语义. 所以,把这一切放在一起: scala> Monoid[A => Option[B] @@ First] res12: scalaz.Monoid[A => scalaz.package.@@[Option[B],scalaz.Tags.First]] = scalaz.std.FunctionInstances0$$anon$13@7e71732c (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |