假设我有一个副产品(一个密封的特性),如
sealed trait Traity
case object Foo extends Traity
case class Bar() extends Traity
case class Baz() extends Traity
Run Code Online (Sandbox Code Playgroud)
使用无形,我可以将多态函数应用于特定实例,但我想要做的是将零参数(无实例)多态函数应用于所有产品(即案例类和案例对象).我不知道语法是什么样的,但在概念上是这样的:
object mypoly extends Poly1 {
implicit def traity[T <: Traity] = when[T]( getClass[T].toString )
}
iterate[Traity](mypoly) // gives List("Foo", "Bar", "Baz")
Run Code Online (Sandbox Code Playgroud)
适合我的目的.
我有下一个代码
trait A { val id: Int }
case class B(id: Int) extends A
case class C(id: Int, name: String) extends A
Run Code Online (Sandbox Code Playgroud)
我想为所有类层次结构定义公共镜头:
import shapeless._
import lens._
val idLens = lens[A] >> 'id
Run Code Online (Sandbox Code Playgroud)
但我得到错误: could not find implicit value for parameter mkLens: shapeless.MkFieldLens[A,Symbol with shapeless.tag.Tagged[String("id")]]
是否可以为所有孩子定义镜头trait A?
在查看一些Scala库的来源时,例如无形,我经常会找到名为的特征LowPriorityImplicits.
你能解释一下这种模式吗?解决了什么问题,模式如何解决?
我正在尝试在 Scala 中实现康威的超现实数字。超现实数是递归定义的——作为一对超现实数的集合,称为左和右,这样右集中的任何元素都不小于或等于左集中的任何元素。这里超现实数之间的关系“小于或等于”也是递归定义的:我们说x ? Ÿ如果
我们首先将零定义为一对空集,然后使用零来定义 1 和 -1,依此类推。
我无法弄清楚如何在编译时强制执行超现实数字的定义。这就是我现在所拥有的:
case class SurrealNumber(left: Set[SurrealNumber], right: Set[SurrealNumber]) {
if ((for { a <- left; b <- right; if b <= a } yield (a, b)).nonEmpty)
throw new Exception
def <=(other: SurrealNumber): Boolean =
!this.left.exists(other <= _) && !other.right.exists(_ <= this)
}
val zero = SurrealNumber(Set.empty, Set.empty)
val one = …Run Code Online (Sandbox Code Playgroud) 假设您有类似以下的案例类
case class Test1(a:String,b:Int,c:Char)
case class Test2(a:String,b:Int)
Run Code Online (Sandbox Code Playgroud)
并使用以下变量实例化类
val test1 = Test1("first",2,'3')
val test2 = Test2("1st",20)
Run Code Online (Sandbox Code Playgroud)
有没有办法使用该.copy方法(或其他方法),将Test2中的变量应用于Test1,如
val test3 = test1.copy(test2) //Note this isn't valid scala code
// Result should be ("1st",20,'3')
Run Code Online (Sandbox Code Playgroud)
如果在纯scala中这是不可能的,那么它将如何在Shapeless 1/2中完成(当前代码在Shapeless 1中,但我们计划在某个时间点升级到Shapeless 2)
基于:
import shapeless._
case class Content(field: Int)
lens[Content] >> 'field
Run Code Online (Sandbox Code Playgroud)
我正在尝试制作镜头创建方法,其中包括:
def makeLens[T <: Product](s: Symbol) = lens[T] >> s
Run Code Online (Sandbox Code Playgroud)
但这似乎并不明显.有可能吗?
如果没有,我想要实现的最终结果是使用案例类内容更新嵌套映射的通用方法,例如:
import scalaz._
import Scalaz._
import PLens._
import shapeless._
import shapeless.contrib.scalaz._
def nestedMapLens[R, T <: Product](outerKey: String, innerKey: Int, f: Symbol) =
~((lens[T] >> f).asScalaz) compose mapVPLens(innerKey) compose mapVPLens(outerKey)
Run Code Online (Sandbox Code Playgroud)
当用T和f参数化时,我无法使它工作.还有其他惯用的无样板解决方案吗?
谢谢!
我不完全清楚Shapeless 的特征emptyCoProduct和coproduct方法的目的是什么TypeClass.
什么时候会使用这个TypeClass特性代替ProductTypeClass?
这两种方法的实施方式有哪些例子?
假设我有一个abitrary KList,为了参数的缘故,它有类型构造函数Option [_],即;
type Example = Option[Int] :: Option[String] :: HNil
Run Code Online (Sandbox Code Playgroud)
有没有办法可以检索由类型参数组成的Hlist?
type Params = Int :: String :: HNil
Run Code Online (Sandbox Code Playgroud)
因此,例如,我可能能够定义某种任意的getOrElse方法
getOrElse(ex:Example, default:Params):Params
Run Code Online (Sandbox Code Playgroud)
现在我正在寻找可能具有这种形式的东西(或类似我建议的类型结构可能不可行).
case class MyOptionList[L <: HList](maybes:L) {
type Concrete = {somehow the hlist params types as an Hlist}
def getOrElse(default:Concrete):Concrete = ???
}
Run Code Online (Sandbox Code Playgroud) 我需要测量n维欧几里得空间的距离,所以我必须要创建多维向量,并能够比较它们的尺寸和执行像"+"或一些基本操作" - ".所以,我想我会使用类型类+无形,如下所示:
但是在投入了大量时间之后,我仍然无法理解如何实现这一点.我的意思是,我可以理解类型类背后的想法可以使用它们,但不知道如何对它们应用无形.提前感谢任何帮助,比如至少最简单的示例,展示如何使用无形的类型类.
鉴于:
case class Foo(a: Option[Int], b: Option[Int], c: Option[Int], d: Option[Int])
Run Code Online (Sandbox Code Playgroud)
我想只允许构造一个Foo 只有至少一个参数Some,即不是所有字段都是None.
编写代数数据类型,然后为每个变体创建子类将是相当多的代码:
sealed trait Foo
case class HasAOnly(a: Int) extends Foo
case class HasAB(a: Int, b: Int) extends Foo
// etc...
Run Code Online (Sandbox Code Playgroud)
是否有更清洁,即更少的代码,以解决我的问题使用shapeless?
scala ×10
shapeless ×10
case-class ×1
lenses ×1
math ×1
scala-macros ×1
scalaz ×1
typeclass ×1
types ×1
vector ×1