标签: shapeless

返回Shapeless中大小为n的List的方法

是否可以使以下代码有效?

def zeroTo[N <: Nat]:Sized[List[Int], N] = {
  new Sized[List[Int], N](List.iterate(0, toInt[N])(1+)) {
    type A = Int
  }
}
Run Code Online (Sandbox Code Playgroud)

我收到一个编译错误,说"无法找到参数toIntN的隐含值:shapeless.ToInt [N]".

scala scala-2.10 shapeless

8
推荐指数
1
解决办法
491
查看次数

将无形可扩展记录传递给函数(续)

考虑到这个问题:将无形可扩展记录传递给函数,Travis的答案显示,将可扩展记录作为参数的每个函数都必须具有隐式选择器作为参数.我想知道如果我们有很多这样的功能,是否可以将这些声明分解.例如:

val w1 = Witness("foo1")
val w2 = Witness("foo2")
val w3 = Witness("foo3")
//Here some "magical" declarations avoiding to declara selectors in fun1, fun2, fun3 below

 def fun1[L <: HList](xs: L) = ... //Access to foo1, foo2, foo3
 def fun2[L <: HList](xs: L) = ... //Access to foo1, foo2, foo3
 def fun3[L <: HList](xs: L) = ... //Access to foo1, foo2, foo3
Run Code Online (Sandbox Code Playgroud)

谢谢

伯努瓦

编辑12月10日

在尝试答案的代码时,会出现两个问题:

  1. 没有告知关于与foo1,foo2,foo3相关的数据的真实类型:因此,像fun1这样的函数不能使用与这些类型相关联的任何方法.例如,即使foo3是Double,它也不能采用它的平方根.
  2. 如果我有打电话( "foo1" - >> "你好")FUN1 ::( "foo2的" - > 1)::( "foo3" …

scala shapeless

8
推荐指数
1
解决办法
1388
查看次数

缺少Sized.unapply

In object Sized(在"shapeless/sized.scala"中)unapplySeq,遗憾的是不提供静态检查.例如,下面的代码在运行时将失败MatchError:

Sized(1, 2, 3) match { case Sized(x, y) => ":(" }
Run Code Online (Sandbox Code Playgroud)

如果有unapply方法而不是返回元组的选项,并且根据大小实例的大小构造元组的具体形状会更好.例如:

Sized(1) => x
Sized(1, 2) => (x, y)
Sized(1, 2, 3) => (x, y, z)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,以前的代码片段将无法编译constructor cannot be instantiated to expected type.

请帮我实现unapplyobject Sized.这种方法是否已在任何地方实施

提前致谢!

scala shapeless

8
推荐指数
1
解决办法
232
查看次数

在无形2.0中动态创建可扩展记录

我需要HList根据键和值映射生成可扩展记录,这里是我想要实现的MWE(你可以在任何REPL中复制/粘贴这个可用的无形2.0,以便重现问题)

import shapeless._; import syntax.singleton._; import record._

case class Foo[T](column: Symbol)

val cols = Foo[String]('column1) :: HNil

val values = Map("column1" -> "value1")

object toRecord extends Poly1 {
  implicit def Foo[T] = at[Foo[T]] { foo =>
    val k = foo.column.name
    val v = values.get(k)
    (k ->> v)
  }
}

val r = cols.map(toRecord)
// r: shapeless.::[Option[String] with shapeless.record.KeyTag[k.type,Option[String]] forSome { val k: String },shapeless.HNil] = Some(value1) :: HNil

val value = r("column1")
// error: No field String("column1") in …
Run Code Online (Sandbox Code Playgroud)

scala shapeless

8
推荐指数
1
解决办法
920
查看次数

如何在scala中要求typeafe恒定大小的数组?

我需要这样的东西:

  def encryptBlock(arr: FixedArray[Size16]) = ???
  val blocks = arr.splitFixed[Size16]
  val encrypted = encryptBlock(FixedArray[Size16]())
Run Code Online (Sandbox Code Playgroud)

所以,确保我只接收128位数组作为输入.

scala shapeless

8
推荐指数
1
解决办法
1606
查看次数

如何使用精炼来表达约束大于22的约束

我试图通过改进(和无形)来探索改进类型检查的可能性.

我想用类型来表示间隔或大小的一些约束.

所以,通过精炼,我可以写出这样的东西:

type Name = NonEmpty And MaxSize[_32]
type Driver = Greater[_15]

case class Employee(name : String @@ Name, age : Int @@ Driver = refineLit[Driver](18))
Run Code Online (Sandbox Code Playgroud)

但是,我想用更大的自然表达对比.

type BigNumber = Greater[_1000]
Run Code Online (Sandbox Code Playgroud)

这个不起作用,因为_1000没有定义.已经定义的最后一个是_22 我可以,没有形状Succ,自己制作,但它非常麻烦.

示例:

type _25 = Succ[Succ[Succ[_22]]]
type _30 = Succ[Succ[Succ[Succ[Succ[_25]]]]]
type _40 = Succ[Succ[Succ[Succ[Succ[Succ[Succ[Succ[Succ[Succ[_30]]]]]]]]]]
type _50 = Succ[Succ[Succ[Succ[Succ[Succ[Succ[Succ[Succ[Succ[_40]]]]]]]]]]
type _60 = Succ[Succ[Succ[Succ[Succ[Succ[Succ[Succ[Succ[Succ[_50]]]]]]]]]]
type _70 = Succ[Succ[Succ[Succ[Succ[Succ[Succ[Succ[Succ[Succ[_60]]]]]]]]]]
type _80 = Succ[Succ[Succ[Succ[Succ[Succ[Succ[Succ[Succ[Succ[_70]]]]]]]]]]
type _90 = Succ[Succ[Succ[Succ[Succ[Succ[Succ[Succ[Succ[Succ[_80]]]]]]]]]]
type _100 = Succ[Succ[Succ[Succ[Succ[Succ[Succ[Succ[Succ[Succ[_90]]]]]]]]]]
// etc.
Run Code Online (Sandbox Code Playgroud)

是否有更好的方式表达这种约束,或以_1000 …

scala shapeless

8
推荐指数
1
解决办法
462
查看次数

如何获取Shapeless HList中的每个类型元素属于类型类的证据

我尝试过以下方法:

trait Evidence[H <: HList, T[_]] {}

object Evidence {
  implicit def HNilEvidence[T[_]] = new Evidence[HNil, T] {}
  implicit def HListEvidence[Head, Remaining <: HList, T[_]](implicit headEv: T[Head], remainingEv: Evidence[Remaining, T]) =
    new Evidence[Head :: Remaining, T] {}
}
Run Code Online (Sandbox Code Playgroud)

只有当所有元素都匹配类型类时,这才能正确地给我一个隐含的证据.

但是,当试图像这样使用它时(一个人为的例子):

def transform[A](a: A)(implicit ev: Evidence[A :: HNil, Ordering]) =
   { List(a,a).sorted }
Run Code Online (Sandbox Code Playgroud)

这给出了错误

error: No implicit Ordering defined for A.
Run Code Online (Sandbox Code Playgroud)

哪个应该在那里存在 Evidence[A :: HNil, Ordering]

scala shapeless

8
推荐指数
1
解决办法
364
查看次数

如何在scala中显示一个HList的类型无形

如何将HList的类型作为String获取,以便我可以打印它.例如"Int :: Long :: String :: HNil"

val gen = Generic[?]
val typeString: String = ???
println("The type is " + typeString)
Run Code Online (Sandbox Code Playgroud)

我知道它的字符串不是很有用,通常你想要的类型 gen.Repr

scala shapeless

8
推荐指数
1
解决办法
564
查看次数

如何创建案例类的随机实例?

假设我有几个案例类,例如:

case class C(c1: Int, c2: Double, c3: Option[String])
case class B(b: Int, cs: Seq[C])
case class A(a: String, bs: Seq[B]) 
Run Code Online (Sandbox Code Playgroud)

现在我想生成一些A带有随机值的测试实例.

我正在寻找一种通用的方法来做到这一点.我可以用运行时反射来做,但我更喜欢编译时的解决方案.

def randomInstance[A](a: A): A = ???
Run Code Online (Sandbox Code Playgroud)

我该怎么做 ?可以用shapeless吗?

random scala shapeless random-data

8
推荐指数
2
解决办法
547
查看次数

无形-副产品中的重复数据删除类型

鉴于我有一种类型Int :+: Int :+: String :+: CNil,是否有简单的方法可以将其转换为Int :+: String :+: CNil

generics scala shapeless

8
推荐指数
2
解决办法
262
查看次数

标签 统计

scala ×10

shapeless ×10

generics ×1

random ×1

random-data ×1

scala-2.10 ×1