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

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

(编辑:李大同)

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

    推荐文章
      热点阅读