标签: shapeless

如何使用无形状迭代联产品中的所有产品类型?

假设我有一个副产品(一个密封的特性),如

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)

适合我的目的.

scala shapeless

10
推荐指数
1
解决办法
2012
查看次数

用于基本特性的无形定义镜头

我有下一个代码

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 shapeless

10
推荐指数
1
解决办法
454
查看次数

解释Scala类型级编程中使用的`LowPriorityImplicits`模式

在查看一些Scala库的来源时,例如无形,我经常会找到名为的特征LowPriorityImplicits.

你能解释一下这种模式吗?解决了什么问题,模式如何解决?

scala type-level-computation shapeless

10
推荐指数
1
解决办法
464
查看次数

Scala 类型约束来检查参数值

我正在尝试在 Scala 中实现康威的超现实数字。超现实数是递归定义的——作为一对超现实数的集合,称为左和右,这样右集中的任何元素都不小于或等于左集中的任何元素。这里超现实数之间的关系“小于或等于”也是递归定义的:我们说x ? Ÿ如果

  • x的左集中没有元素a使得y ? ,和
  • y的右集中没有元素b使得b ? ×

我们首先将零定义为一对空集,然后使用零来定义 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)

types scala type-level-computation shapeless scala-macros

10
推荐指数
1
解决办法
212
查看次数

在不同类型的案例类之间安全地复制字段

假设您有类似以下的案例类

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)

scala generic-programming case-class shapeless

9
推荐指数
1
解决办法
1928
查看次数

无形:通过案例类或字段参数化的通用镜头

基于:

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参数化时,我无法使它工作.还有其他惯用的无样板解决方案吗?

谢谢!

scala scalaz lenses shapeless

9
推荐指数
1
解决办法
1279
查看次数

Shapeless中TypeClass特征的emptyCoproduct和coproduct方法的目的是什么?

我不完全清楚Shapeless 的特征emptyCoProductcoproduct方法的目的是什么TypeClass.

什么时候会使用这个TypeClass特性代替ProductTypeClass

这两种方法的实施方式有哪些例子?

scala typeclass type-level-computation shapeless

9
推荐指数
1
解决办法
820
查看次数

Scala,将KList的类型参数作为HList获取

假设我有一个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)

scala shapeless

9
推荐指数
1
解决办法
466
查看次数

使用无形的任何维度的Scala矢量

我需要测量n维欧几里得空间的距离,所以我必须要创建多维向量,并能够比较它们的尺寸和执行像"+"或一些基本操作" - ".所以,我想我会使用类型类+无形,如下所示:

在Scala中实现通用Vector

但是在投入了大量时间之后,我仍然无法理解如何实现这一点.我的意思是,我可以理解类型类背后的想法可以使用它们,但不知道如何对它们应用无形.提前感谢任何帮助,比如至少最简单的示例,展示如何使用无形的类型类.

math scala vector shapeless

9
推荐指数
1
解决办法
859
查看次数

使用`Option`Felds清理`case class`

鉴于:

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 shapeless

9
推荐指数
2
解决办法
476
查看次数