- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想我需要一个HList,它必须被约束为使其所有元素都是某种类型的子类型。 LUBConstraint
似乎是我想要的,并且确实确实限制了这样的HList的构造-但我看不到如何再次获取证据,因此我可以进行映射(实际上是遍历,因为它必须是一元的)在HList上,并在每个元素上调用一个方法(存在于LUB类型中)。
另外,我希望遍历操作产生的HList的类型与输入HList的类型完全相同。
用例是一种功能性的“监听器列表”-HList的所有元素都是“监听器”,必须将其通知“事件”,接受或拒绝它们,并以更新的“内部状态”返回自身的新版本。 。如果这是我所需要的,那么我可以使用一个普通的不可变Scala集合。但我也希望直接输入单个元素而不使用asInstanceOf
-因此尝试使用HList的动机。
最佳答案
通常,如果您要对HList
中的所有元素执行某些操作,则需要在HList
上映射一个多态函数值。例如,假设我具有以下设置:
trait Listener[L <: Listener[L]] {
def handle(s: String): Option[L]
}
class FooListener extends Listener[FooListener] {
def handle(s: String) =
if (s.size == 3) Some(this) else None
}
class BarListener extends Listener[BarListener ]{
def handle(s: String) = Some(this)
}
import shapeless._
val listeners = new FooListener :: new BarListener :: HNil
String
并收集结果。如果我只想发送一个固定值,这将很容易:
object event123 extends Poly1 {
implicit def listener[L <: Listener[L]] = at[L](_.handle("123"))
}
val result = listeners.map(event123)
Option[FooListener] :: Option[BarListener] :: HNil
。如果我使用的是
shapeless-contrib,则可以对这个
HList
进行排序:
import scalaz._, Scalaz._, shapeless.contrib.scalaz._
val sequenced: Option[FooListener :: BarListener :: HNil] = sequence(result)
traverse
:
traverse(listeners)(event123)
String
,则情况会更加复杂:
object event extends Poly1 {
implicit def listener[L <: Listener[L]] = at[(L, String)] {
case (listener, string) => listener.handle(string)
}
}
traverse(listeners.zip(listeners.mapConst("123")))(event)
trait Notifiable[L <: HList] {
def tell(s: String)(l: L): Option[L]
}
object Notifiable {
implicit val hnilNotifiable: Notifiable[HNil] = new Notifiable[HNil] {
def tell(s: String)(l: HNil) = Some(HNil)
}
implicit def hconsNotifiable[H <: Listener[H], T <: HList](implicit
tn: Notifiable[T]
): Notifiable[H :: T] = new Notifiable[H :: T] {
def tell(s: String)(l: H :: T) = for {
h <- l.head.handle(s)
t <- tn.tell(s)(l.tail)
} yield h :: t
}
}
def tell[L <: HList: Notifiable](s: String)(l: L) =
implicitly[Notifiable[L]].tell(s)(l)
val sequenced: Option[FooListener :: BarListener :: HNil] =
tell("123")(listeners)
Option
,不适用于任意应用程序),但是它不需要额外的顺序依赖性,而且由于怪异的局限性,可以说它比跳过箍部分地应用多态函数值要少一些困惑的编译器。
关于scala - HList的证据保全LUB约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30321971/
给定一个具有协变类型参数的类: scala> class G[+A] defined class G 以下列表显示了 List[G[Any]] 的最小上限。 scala> List(new G[Int
Table 15.25-B在 JLS 版本 8 中说条件表达式的类型 true ? null : 0.0 是 lub(null,Double),其中 lub 似乎是来自 section 4.10.4
以下引自 JLS 14.20 The declared type of an exception parameter that denotes its type as aunion with alte
我想创建和使用 Seq[T] Scala 中的集合 并确保它只使用一种类型。所以如果我使用: val l = List(1, 2, 2.0) 应该发生编译时错误 - List元素都应该是Double或
我是一名优秀的程序员,十分优秀!