- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的一个项目使用了混合的Scala功能,这些功能似乎不能很好地融合在一起:
Lazy
import shapeless._
trait Show[A] {
def show(a: A): String
}
object Show {
def from[A](f: A => String): Show[A] = new Show[A] {
override def show(a: A) = f(a)
}
implicit val intShow: Show[Int] = Show.from(_.toString)
implicit def singletonShow[A](implicit
sa: Show[A]
): Show[A :: HNil] = Show.from {
case (a :: HNil) => sa.show(a)
}
implicit def singletonCaseClassShow[A, H <: HList](implicit
gen: Generic.Aux[A, H],
sh: Lazy[Show[H]]
): Show[A] = Show.from {
a => sh.value.show(gen.to(a))
}
}
object Run extends App {
implicit class ShowOps[A](val a: A) extends AnyVal {
def show(header: String = "> ")(implicit sa: Show[A]): String =
header + sa.show(a)
}
case class Foo(i: Int)
println(Foo(12).show())
}
Run.scala:10: could not find implicit value for parameter sa: Show[Run.Foo]
[error] println(Foo(12).show())
header
参数传递给show
中的Run.scala
Lazy
中的隐式Show[H]
的Show.scala
包装器最佳答案
简短答案:
如果将上下文移动到隐式类,则它也可以正常工作。您必须牺牲value类来做到这一点,但是我认为更容易告诉编译器仅具有A
的Show
会被它丰富:
implicit class Show2Ops[A : Show](a: A) {
def show2(header: String = "> ") = header + implicitly[Show[A]].show(a)
}
println(Foo(12).show2())
Lazy
做一些有趣的技巧,这些技巧很难遵循。您没有特别询问
Lazy
在做什么,但是我对此感到很好奇,因为我一直在使用它,但不确定它是如何工作的。所以我看了一下。据我所知,它就像这样。
case class A(first: Int, next: Option[A])
Show
的
Option
伴侣中还有另一种情况:
implicit def opt[A](implicit showA: Show[A]): Show[Option[A]] = Show.from {
case Some(a) => s"Some(${showA.show(a)})"
case None => "None"
}
singletonShow
相比,您有一个真实的
HNil
情况和一个归纳情况,通常是这样:
implicit val hnil: Show[HNil] = Show.from(_ => "")
implicit def hcons[H, T <: HList](implicit
showH: Show[H],
showT: Show[T]
): Show[H :: T] = Show.from {
case h :: t => showH(h) + ", " + showT(t) // for example
}
singletonCaseClassShow
重命名为
genericShow
,因为它不再仅适用于单例。
Lazy
中没有
genericShow
。当您尝试调用
Show[A]
时,编译器将转到:
genericShow[A]
,带有针对Show[A]
的开放式隐式搜索hcons[Int :: Option[A] :: HNil]
,具有对Show[A]
和Show[Int :: Option[A] :: HNil
的开放式隐式搜索intShow
,使用开放式隐式搜索Show[A]
和Show[Int]
和Show[Option[A] :: HNil]
hcons[Option[A] :: HNil]
,具有对Show[A]
和Show[Option[A] :: HNil]
的开放式隐式搜索opt[A]
,使用开放式隐式搜索Show[A]
和Show[Option[A]]
和Show[Option[A] :: HNil]
genericShow[A]
,使用开放式隐式搜索Show[A]
和Show[Option[A]]
和Show[Option[A] :: HNil]
Lazy
如何克服此问题的方法是在编译器尝试实现其隐式实例时进入宏。因此,当您在
implicit showH: Lazy[Show[H]]
中使用
hcons
而不是
Show[H]
时,编译器会转到该宏以查找
Lazy[Show[H]]
,而不是停留在隐式
Show
情况下。
T
的隐式实例(对于
Lazy[T]
)。如果要解决已经打开的隐式,它将替换一个伪树(本质上是告诉编译器“我明白了,不用担心”),该伪树跟踪打结的依赖项,以便其余解析得以完成。最后,它清理了虚拟树(我不太清楚这是如何工作的;那里有很多代码,而且非常复杂!)
Lazy
似乎弄乱了您的默认参数情况?我认为这是几件事的融合(仅是一个假设):
ShowOps
,在一个值上调用.show
会使该值隐式包装在ShowOps[A]
中。什么是A?是Foo
,AnyRef
,Any
吗?它将是唯一的单一类型吗?这还不是很清楚,因为那时A
上没有任何限制,而Scala不知道您对.show
的调用实际上会对其进行限制(由于上下文的限制)。 Lazy
,则可以正常运行,因为如果Scala选择了错误的A
而.show
没有进行类型检查,它将意识到它的错误并从选择的A
中退出。 Lazy
,还有许多其他逻辑,Scala欺骗了Scala以为它选择的任何A
都很好。但是,当需要关闭循环时,它就无法解决,到那时,为时已晚。 A
中选择ShowOps[A]
的初始选择。 关于scala - Shapeless的“惰性”和默认参数导致隐式解析失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42318018/
有 (Some(1), 2, Some(3)) 我希望得到 (Some(1), Some(2), Some(3)) 使用无定形可以做到吗? 最佳答案 是的,无形可以做很多事情! import sh
我正在开发一个用于经济模型的小型库,用于检查实体的单位,使用类型,例如而不是 val apples = 2.0我们写 val apples = GoodsAmount[KG, Apples](2.0)
据我了解,依赖类型允许您不指定输出类型: 例如,如果您有一个类型类: trait Last[In] { type Out } 然后你可以在不指定输出类型的情况下召唤一个实例: implicitly
我正在考虑做类似 Safely copying fields between case classes of different types 的事情但字段重新排序,即 case class A(foo
一旦出现类型参数,shapeless 中的类型不等式似乎就不安全了。 例如下面的代码编译 def someMethod[T](in : T) = { implicitly[T =:!= Strin
我仍在努力了解 Shapeless(在较小程度上,Scala!)并且我一直在编写一些简单的代码来为案例类生成随机实例数据 - 主要基于此处的指南:http://enear.github.io/2016
shapeless 是否提供了一个类型类/宏来调用一个 HList,其中包含一个 case 类的所有参数的默认值? 假设我们有这个案例类: case class User(name: String,
Shapeless 有一个整洁的类型类 derivation mechanism它允许您定义类型类并获得任何类型类的自动派生。 要使用派生机制作为类型类的用户,您将使用以下语法 import MyTy
昨天我和几个同事在探索Shapeless,我们决定写一个玩具方法来向case类的第一个参数添加一个,当该参数是Int时。 : def addOneToCaseClass[C, H <: HList,
给定一组具有两个不同子集的 Adt 例如: sealed trait Domain[Y] sealed trait Command[Y] extends Domain[Y] sealed trait
给定一个案例类 A我可以使用以下代码段使用 Shapeless 提取其字段名称: val fieldNames: List[String] = { import shapeless._ imp
假设我有几个功能: val f1: Int => String val f2: (Int, Int) => String val f3: (Int, Int, Int) => String def f
鉴于我的类型为 Int :+: Int :+: String :+: CNil , 有没有简单的方法把它变成Int :+: String :+: CNil ? 最佳答案 这取决于您所说的“容易”是什么
在我正在开发的 Play 应用程序中,我正在尝试改进我们处理标志的系统,其中一些是当用户通过链接导航我们的应用程序时的持久选项。我想使用 Shapeless 将选项的定义映射到它的值,并仅从标记为要传
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 7 年前。 Improve this ques
我可以编写一个简单的递归多态函数: object simpleRec extends Poly1 { implicit def caseInt = at[Int](identity) impl
我想将一个类的更新实例合并到一个基本实例中,如果该字段在基本实例中为“空”,则选择更新实例的字段而不是基本实例。下面的示例合并了 base 和 update: case class Foo(a: Op
很容易按类型过滤无形状的 HList: val hlist = 1 :: 2 :: "3" :: true :: false :: HNil hlist.filter[Int] 但是我怎样才能制作我的
是否可以使用 shapeless 将 1 个对象转换为另一个对象 做一些小的转换,比如将 Option[T] 转换为 T (无需为每个类手动定义映射) 忽略缺失的字段 进口无形。_ 导入 shapel
有谁知道如何使用 Shapeless 进行此测试。 package net.jtownson.swakka.jsonschema import org.scalatest.FlatSpec impor
我是一名优秀的程序员,十分优秀!