- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我以为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")
}
}
最佳答案
让我们用不同的眼光来看待这个问题。PartialFunction[A, B]
同构于 A => Option[B]
. (实际上,为了能够在不触发对 A
的评估的情况下检查它是否是为给定的 B
定义的,您需要 A => LazyOption[B]
)
所以如果我们能找到一个 Monoid[A => Option[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]
,我们有什么 Monoid(s)?作为我们的
Z
? Scalaz 提供了三个。主实例需要
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)
Some
,则不会附加这两个选项的内容。 ,我们可以简单地选择两个中的第一个或最后一个。两个触发这个,我们用称为标记类型的技巧创建了一个不同的类型。这在精神上类似于 Haskell 的
newtype
.
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)
Option[A] @@ First
,通过它附加
Monoid
, 使用相同的
orElse
语义作为你的例子。
scala> Monoid[A => Option[B] @@ First]
res12: scalaz.Monoid[A => scalaz.package.@@[Option[B],scalaz.Tags.First]] =
scalaz.std.FunctionInstances0$$anon$13@7e71732c
关于Scala PartialFunction 可以是 Monoid 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9067904/
这有效: scala> List(1, "aa") collect { case n : Int => n+2 } res52: List[Int] = List(3) 这很好用: scala> v
PartialFunction 是一个天然的提取器,它的 lift 方法提供了精确的提取器功能。所以使用部分函数作为提取器会非常方便。这将允许以比可用于 PartialFunction 的普通 orE
这是我想了一段时间的事情。我经常看到这种模式: if (pf.isDefinedAt(in)) pf(in) 通过将其分解为两个单独的调用,所有在#isDefinedAt 中求值的模式也将在#appl
让我们定义一个 PartialFunction[String, String]和一个 PartialFunction[Any, String] 现在,给定 orElse 的定义 def orElse[
如何拦截 PartialFunction?例如在 Actor 中,如果我只想打印进入以下接收方法的所有内容,然后再将其传递给流程方法: class MyActor extends Actor {
我有一个名为 errorMap 的 PartialFuncton[Throwable,Future[Result]] 将 throwable 转换为结果或失败的 future 。我可以像这样通过 li
定义 PF 有两种方式: 1) 使用文字 case {}语法和 2) 作为显式类。我需要以下函数抛出一个 MatchError,但在第二种情况下不会发生。 1) 带外壳 val test: Parti
所以,假设我想为 PartialFunction 提供一个“包罗万象”的回退: val foo: PartialFunction[Int, String] = { case 1 => "foo" }
我不认为这段代码应该有效,但它确实有效(在 Scala 2.10 中): scala> ((i: Int) => i.toString match { | case s
我之前问过这个问题:Combine a PartialFunction with a regular function 然后意识到,我实际上并没有问对。 所以,这是另一个尝试。 如果我这样做: va
我正在学习Scala,从scala doc中找到PartialFunction和Function1的定义,如下所示: trait PartialFunction[-A, +B] extends (A)
偏函数 在 Scala 中,一个 PartialFunction 简而言之,是一个额外定义了一个 isDefinedAt 的函数方法。 用一系列 case 很容易定义偏函数陈述。一个简单的例子是,例如
我以为PartialFunction可以 Monoid .我的思维过程正确吗? 例如, import scalaz._ import scala.{PartialFunction => -->} im
在 Scala 中,PartialFunction[A, B] 类派生自类型 Function[A, B](请参阅 Scala 引用,12.3.3)。然而,这对我来说似乎违反直觉,因为 Functio
我对 scala 编译器允许编译这个相当奇怪、明显错误的代码这一事实感到有点失望: val foo: PartialFunction[Any, Unit] = { case s: String =
Scala API 中没有内置函数可以将 PartialFunction 提升为 Either。 这是我的版本: def liftToEither[A, B, C](pf: PartialFunc
在 scala 中,Futures 有一种采用 PartialFunction 的救援函数。如果 Future 通过响应解决,则跳过此代码,但如果发生故障,则会调用此代码。 我想简单地将部分函数包装在
我定义了 PartialFunction 的 2 个版本在斯卡拉。 val doubleEvens1: PartialFunction[Int, Int] = { case x if x
当第一个函数具有 case _ => 通配符模式时,是否有可能 orElse 组成两个 PartialFunction 匹配因此有效的任何内容是一个总函数。 例如给定 val pf1: Partial
我正在尝试将部分函数传递给通过滑动窗口在 DStream 批处理中捕获的所有 RDD 的并集。假设我在离散为 1 秒批处理的流上构造了一个超过 10 秒的窗口操作: val ssc = new Str
我是一名优秀的程序员,十分优秀!