标签: shapeless

为什么我不能索引到通过映射到另一个HList获得的HList?

即使.head不起作用.

我需要做些什么改变来完成这项工作?

import shapeless._
import HList._
import Nat._

scala> case class Foo[A](a: A)
defined class Foo

scala> case class Bar[A](f: Foo[A])
defined class Bar

scala> val xs = Foo(23) :: Foo("blah") :: HNil
xs: shapeless.::[Foo[Int],shapeless.::[Foo[java.lang.String],shapeless.HNil]] = Foo(23) :: Foo(blah) :: HNil

scala> object mapper extends (Foo ~> Bar) {
     |   def apply[A](f: Foo[A]) = Bar(f)
     | }
defined module mapper

scala> xs map mapper
res13: mapper.Out = Bar(Foo(23)) :: Bar(Foo(blah)) :: HNil

scala> res13.apply[_1]
<console>:38: error: could not …
Run Code Online (Sandbox Code Playgroud)

scala shapeless

5
推荐指数
1
解决办法
348
查看次数

映射到函数内的HList

以下代码似乎足以编译和运行

case class Pair(a: String, b: Int)

val pairGen = Generic[Pair]

object size extends Poly1 {
  implicit def caseInt = at[Int](x => 1)
  implicit def caseString = at[String](_.length)
}

def funrun(p: Pair) = { 
  val hp: HList = pairGen.to(p)
  hp.map(size)
}
Run Code Online (Sandbox Code Playgroud)

但是编译器说"找不到参数映射器的隐含值".在我的用例中,我想映射一个HList来获取String的HList,然后将String的HList转换为Scala List [String].有任何想法吗?

scala hlist type-level-computation shapeless

5
推荐指数
1
解决办法
1091
查看次数

无法找到参数lgen的隐式值:shapeless.LabelledGeneric.Aux

我是Shapeless的新手.我有利用了无形的"自动类型类派生"的辅助类(https://gist.github.com/negator/fbbcd1b2ce9a85b762b7)帮我填充JSON读取和写入.

import play.api.libs._
import json._

import shapeless.{ `::` => :#:, _ }
import poly._

object SReads extends LabelledTypeClassCompanion[Reads] {
  object typeClass extends LabelledTypeClass[Reads] {

    def emptyProduct: Reads[HNil] = Reads(_ => JsSuccess(HNil))

    def product[F, T <: HList](name: String, FHead: Reads[F], FTail: Reads[T]) = Reads[F :#: T] {
      case obj @ JsObject(fields) =>
      for {
        head <- FHead.reads(obj \ name)
        tail <- FTail.reads(obj - name)
        } yield head :: tail

        case _ => JsError("Json object required")
      }

    def project[F, G](instance: …
Run Code Online (Sandbox Code Playgroud)

scala sbt shapeless playframework-2.4

5
推荐指数
1
解决办法
793
查看次数

有没有办法迭代无形的 HMap(异构地图)的内容?

在将源 AST1 转换为目标 AST2(在 Scala 中构建 DSL 编译器)时,我试图实现某种多态缓存。因为我希望缓存为翻译结果保留精确的类型,所以我使用了无形的 HMap。它按预期工作,但是在某些时候我需要迭代缓存内容以将其转储到必须记录翻译过程的文件中,然后将用于构建从 A2 到 A1 的回译。通过查看 HMap 的源代码,我看到有一个我无法访问的底层 HashMap[Any, Any],因为它不是 HMap 中的 val,而且我看到 HMap 实际上是一个多态函数值,这意味着我可以将它应用到 HList 上,它的类型对应于 HMap 键类型的子集,但我真正想做的是能够折叠一个多态函数,该函数在此 HMap 上接受多态(键,值)参数,以另一种形式检索其内容(例如,在标准 HashMap 元组中切片)。有没有办法做到这一点?最好的事物。

scala shapeless

5
推荐指数
0
解决办法
265
查看次数

映射到压缩的 HLists

我正在尝试使用 shapeless 从两个 HList 中选择“非空”值:

import shapeless.{ HNil, Poly2}

object choose extends Poly2 {
  implicit def caseInt =
    at[Int,Int]{
      case (_,n) if n > 0 => n
      case (o,_) => o
    }

  implicit def caseString  =
    at[String,String] {
      case (_,n) if n.nonEmpty => n
      case(o,_) => o
    }
}


val g = "a" :: "" :: 0 :: HNil
val h = "" :: "a"  :: 5 :: HNil

g.zip(h).map(choose)
Run Code Online (Sandbox Code Playgroud)

我在缺少隐式映射器时遇到错误如果我理解正确,我需要提供证明 zip 的结果是可映射的,但我不知道该怎么做

scala shapeless

5
推荐指数
1
解决办法
154
查看次数

如果类型是 HList 的成员,我如何检查无形?

我正在对字符串进行一系列预处理步骤,并且正在考虑使用HLists 来提高步骤的安全性。某些处理步骤必须在其他处理步骤之后运行,所以我正在考虑在类型系统中对其进行编码。我的第一次尝试是:

trait Step
trait Raw extends Step
trait A extends Step
trait B extends Step
trait DependsOnA extends Step
trait DependsOnB extends Step

case class ToBeProcessed[S <: Step](value: String)

object ToBeProcessed {
    def raw(input: String): ToBeProcessed[Raw] = ...
    def doA(input: ToBeProcessed[Raw]): ToBeProcessed[A] = ...
    def doB(input: ToBeProcessed[A]): ToBeProcessed[B] = ...
    def doDependsOnA(input: ToBeProcessed[B]): ToBeProcessed[DependsOnA] = ...
    def doDependsOnB(input: ToBeProcessed[DependsOnA]): ToBeProcessed[DependsOnB] = ...
}
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为它迫使我按顺序调用所有内容doA> doB> doDependsOnA> doDependsOnB,这是它工作的可能顺序,但是:

  1. 它强制不相互依赖的步骤之间的依赖
  2. 如果我想实现一个新的中间步骤,doC我必须改变与它无关的事物的类型

所以我开始阅读 …

scala type-level-computation shapeless

5
推荐指数
1
解决办法
234
查看次数

将Shapeless HList转换为元组

try-with-resources在Scala中有这个版本。我想知道是否可以使用Shapeless和HList制作通用版本?

import scala.util.{Failure, Success, Try}

class Loan1[A <: AutoCloseable](resource: A) {
  def to[B](block: A => B): B = {
    Try(block(resource)) match {
      case Success(result) =>
        resource.close()
        result
      case Failure(e) =>
        resource.close()
        throw e
    }
  }
}

class Loan2[A <: AutoCloseable, B <: AutoCloseable](r1: A, r2: B){
  def to[R](block: (A,B) => R): R = {
    Try(block(r1,r2)) match {
      case Success(result) =>
        r1.close(); r2.close()
        result
      case Failure(e) =>
        r1.close(); r2.close()
        throw e
    }
  }
}

object Loan {

  def apply[A …
Run Code Online (Sandbox Code Playgroud)

scala hlist shapeless

5
推荐指数
1
解决办法
785
查看次数

如何使用scala选项解析器解析泛型案例类字段?

我有一个案例类包括大约20个字段,所有字段都是原始类型.

case class A( f1: String, f2: Int .....)
Run Code Online (Sandbox Code Playgroud)

我不得不从命令行解析这些字段(不幸的是).我可以,但我真的不想写这20次

opt[String]("f1") required() valueName "<f1>" action { (x, c) =>
    c.copy(f1 = x)
  } text "f1 is required"
//...repeat 20 times
Run Code Online (Sandbox Code Playgroud)

我可以通过反射获得字段名称和字段类型,但我不知道如何在for循环中将这些信息粘贴到此调用中

我可以将它与无形连接起来,但我仍然不熟悉它,这可以在没有形状的情况下完成吗?

==

scala选项解析器=> scopt

generics scala shapeless

5
推荐指数
1
解决办法
706
查看次数

如何使用无形来检测字段类型注释

我正在尝试收集在编译时使用特定注释的案例类的字段shapeless.我试图玩下面的片段,但它没有按预期工作(输出什么,而不是打印"我").我怎样才能使它工作?

import shapeless._
import shapeless.labelled._

final class searchable() extends scala.annotation.StaticAnnotation
final case class Foo(@searchable i: Int, s: String)

trait Boo[A] {
  def print(a: A): Unit
}
sealed trait Boo0 {
  implicit def hnil = new Boo[HNil] { def print(hnil: HNil): Unit = () }
  implicit def hlist[K <: Symbol, V, RL <: HList](implicit b: Boo[RL]): Boo[FieldType[K, V] :: RL] =
    new Boo[FieldType[K, V] :: RL] {
      def print(a: FieldType[K, V] :: RL): Unit = {
        b.print(a.tail)
      }
    } …
Run Code Online (Sandbox Code Playgroud)

scala shapeless

5
推荐指数
1
解决办法
512
查看次数

Shapeless Witness 以及它如何给出实际的单例类型

我试图以无形的方式理解单例类型,并面临对单例类型编译时类型的误解。下面是一个例子:

val x: Witness.`120`.T = 120.narrow
Run Code Online (Sandbox Code Playgroud)

它工作正常,但这种结构看起来很不寻常。什么是Witness.120?在 IDE 中,它指向一些宏函数selectDynamic

def selectDynamic(tpeSelector: String): Any = macro SingletonTypeMacros.witnessTypeImpl
Run Code Online (Sandbox Code Playgroud)

具有编译时类型Any和由施工判断Witness.120.T一个type部件T。这看起来很神奇......当一个人写下这样的东西时,任何人都可以解释一下实际发生的事情:

val x: Witness.`120`.T = //...
Run Code Online (Sandbox Code Playgroud)

scala generic-programming type-level-computation shapeless

5
推荐指数
1
解决办法
634
查看次数