问题标签 [shapeless]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
573 浏览

scala - HList/KList 是否适合作为方法参数?如何参考?类型列表?

我发现了 HList / KList,它们非常酷。我有一个实际用例,其中具有保守类型信息的异构类型和可变长度容器将非常有用(有关更多信息,请参阅下面的背景)。但是,我还没有理解 H/KList 作为方法参数的用法,我被迫对参数进行完全类型注释或松散类型信息。如果完整类型当然是未知的,H/KLists 甚至可以用作参数吗?如何在不丢失类型信息的情况下引用 H/KList?

“类型列表”可以用来指代异构和可变长度类型参数的元组吗?这里它说: ... the types of the elements can be tracked separate from the actual element values. To do this we create an purely abstract type (it has no instances) which models a list of types, let's call it TList. 我玩过它,但还不明白如何将它用于 HList 的类型注释作为参数。

基本上,我想要这样的东西:

其中 TL 指的是类型列表,X 指的是当前元素的类型。所以这里应该将一个 HList 映射到另一个类似 Tuple 的容器 TypedLink,由类型列表 TL 参数化。每个元素都将被包装在另一个参数化容器 TypedHandle 中,使用当前类型 X 进行类型化。

这可能吗?

我看到了 Shapeless 的 HList 及其“统一”方法,但问题仍然存在:除了可变长度之外,我不知道如何在参数列表中引用它。

我的第二个希望是使用 KList。它适用于我的情况,因为 TypedHandle 是具有相同构造函数的通用容器。根据 apocalisp 的说法,使用 KList 似乎更容易键入注释

将是类型:

但是,问题仍然存在:在方法定义中,我不知道它是否会是

或一个

所以我也不知道如何键入注释 KList 作为方法参数。

感谢您的任何提示!

背景:我正在为优秀的 OO- 和图形数据库 hypergraphdb 编写 scala 便利扩展。Hypergraphdb 的超边 HGLink 基本上是 HGHandle 的元组。HGHandle 指的是本身有类型的原子。因此 HGLink 本身将是异构类型和可变长度的。但是,到目前为止,HGLink 的实现是无类型的,并且是由 HGHandle 的无类型实现构建的。我猜 java 的类型系统的表现力不足以反映 hypergraphdb 的(非常优秀的)类型系统(例如,它也有更高种类的类型)。

基本上,我正在尝试将 scala 与 hypergraphdb 的类型系统连接起来,我学到了很多东西,直到现在这真的很有趣。除了许多其他黑客之外,TypedHandle 已经很好用了。

感谢您的任何建议。

0 投票
5 回答
8456 浏览

scala - 使用 Scalaz 或 Shapeless 将选项元组转换为元组选项

我希望得到

并拥有

我希望得到

0 投票
4 回答
12201 浏览

scala - scala 不明确支持依赖类型的任何原因?

有路径依赖类型,我认为可以在 Scala 中表达 Epigram 或 Agda 等语言的几乎所有特性,但我想知道为什么 Scala 不更明确地支持这一点,就像它在其他领域做得很好(比如, DSL) ? 我错过了什么,比如“没有必要”?

0 投票
1 回答
365 浏览

scala - 基于类的类型参数使用 Poly1 在方法中映射 HList

我有类,参数化HList和其他类型。如何在其中一种方法中使用mapon HList

此代码的编译抛出java.lang.AssertionError

我的目标是这样的结果:

0 投票
3 回答
1121 浏览

scala - 通用重写 Scala 案例类

是否可以一般替换案例类中的参数?更具体地说,假设我想要一个接收“查找”案例类和“替换”案例类(如语法规则的左侧和右侧)以及目标案例类的替代函数,该函数将返回一个用替换案例类替换了查找案例类的参数的新案例类?该函数也可以简单地采用一个案例类(产品?)和一个应用于案例类的所有参数/产品的函数。

显然,给定一个特定的案例类,我可以使用 unapply 和 apply - 但是一般(给定任何案例类)编写这种函数的最佳/最简单/等方法是什么?

我想知道是否有使用 Scala 2.10 反射功能或来自 shapeless 的 Iso.hlist 的好的解决方案。

例如,我真正想做的是,给定如下类......

... 有一个函数可以接受任意案例类并返回它的副本,并将 From 类型的任何元素替换为 To 类型的实例。

0 投票
3 回答
839 浏览

scala - Scala中具有可变长度索引的“更新”方法

我正在为诸如具有可变维度的数组之类的东西编写代码。我所做的是维护一个线性的底层集合,并用索引访问方法将其包装起来。由于数据结构的维度是未知的,我写了类似的东西

而且效果很好。但是,我不能做同样的事情来更新方法和运算符,如 +=,所以我最终编写了类似的方法

这很好,但不是我真正想要的。我想关于更新的问题可以通过两种方式解决:

  1. 更改更新函数中的参数顺序,这使它看起来很奇怪。
  2. 允许不作为最后一个变长参数。我发现这个问题是在一般环境中提出的,可以通过使用柯里化函数来解决,这在此处不适用。

+= 的问题似乎更复杂,甚至在索引是固定长度时也存在。也许我们可以添加一个具有 += 运算符的对象并使用 this(...) 来获取该对象(这样 this(...) += v 将调用一些我们期望的方法),但这会与应用方法。

如果有人对上述任何问题有解决方案,或者有理由说明我们不应该编写这样的代码,请分享您的想法!谢谢~

0 投票
1 回答
242 浏览

scala - 在 scala 中提供“uncurried”的一般浓缩

f: A => B => ... => Z在 scala/scalaz/shapeless/etc 中是否存在一般丰富的内容?这样f.uncurried:(A, B, ...) => Z吗?

目前我有这个,但我相信某处必须有一个预先存在的、更通用的解决方案。

0 投票
1 回答
297 浏览

scala - 使用 Shapeless 解决函数 args 以驱动列表处理的问题

以下要点包含我正在玩的一个想法的代码

这个想法是您使用函数的参数 arity,在本例中是 Product 类型的 arity,来驱动关联 List[A] 的解析。有点像使用胶带从石墨上剥离石墨烯层,即功能的类型将事物从列表中拉出。这只是一个使用单一包含类型的草图,但我想它可以被概括。重要的方面是函数本身不知道 List 处理。

然而......当试图解决 ToArity[P,N] 隐式时,这个概念似乎失败了。如 printArity() 所示,ToArity 本身是可解析的。

有人可以解释为什么这在 fromF1 的上下文中无法解决吗?是不是它不能解决所有依赖的隐式,然后用第一个来注册错误,即找不到满足 ToArity、ToInt 和 SizedHListAux 的 N?

0 投票
1 回答
258 浏览

scala - 如何使用无形在 scala 中实现 [x] -> x?

如何使用无形获取一个元素列表的头部?这不编译:

0 投票
1 回答
363 浏览

scala - 如何使用无形拆分Scala列表

我正在尝试在 N 处拆分大小为 S 的列表,其中已知 N,M 总和为 S。这不会编译:

错误

最终正确版本