问题标签 [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 投票
0 回答
352 浏览

scala - Scala HList 操作:灵活的结构可能吗?

我写了一个我无法做到的事情的小例子。我走错路了吗?

我有一个包含 HList 类型的对象 Bar 。我有一个对象 Foo,它的类型可以从以前的 HList 构造一个新的 HList。在 Foo 的子类 FooI 中,我声明这个 Hlist 是用无形的 FilterNot 构造的,我创建了一个 Bar,更新它,当我测试类型时,我得到以下结果:

请注意,如果我有一个

(并相应地实例化和测试条形对象)

[添加]

我尝试了另一个没有类型声明并且只使用值的版本。似乎结构更好,但没有更多工作。此外 shapeless.HList.toString 返回一个 NoSuchMethodException 对我来说仍然是一个谜......

0 投票
1 回答
181 浏览

scala - 如何欺骗 Scala 不为 Nothing 找到重复的隐式

我正在尝试使用 Scala 中的 typeclass 模式来标记所有有效的 API 可序列化类型,以便我们可以围绕我们序列化的内容获得编译时安全性。我们的底层库接受一个AnyRef在序列化之前没有显式声明类型时可能导致奇怪错误的类型。

我们允许发送一个公共模型、一个可迭代的公共模型、一个公共模型选项或一个单元。

此方法适用于除参数类型为选项的方法之外的所有方法。这是因为Noneis an Option[Nothing], 所以T = Nothing它将告诉编译器查找类型的隐式对象,SafeForPublic[Nothing]它会同时SafeForPublic[PublicModel]找到SafeForPublic[Iterable[PublicModel]]

知道如何欺骗编译器不为Nothing. 我看到 Miles Sabin 使用了一个技巧:

但我不知道如何使用它。哈普?

0 投票
1 回答
350 浏览

scala - 在嵌套多态值中使用封闭泛型类型参数

是否可以仅使用没有 TypeTags 的多态函数来重写以下示例?该示例由一个类组成,当应用于具有相同类型参数的实例并且该类型参数具有不同值时,该类具有返回A[T]的方法。然后被映射到一个两次的 hlist上,生成一个嵌套 hlist 的 hlist,其中包含将每个项目与其他项目匹配的结果:matchestrueATfalsematcheslA[T]l

每个项目都有一个匹配项,即结果是:

当我尝试在没有 TypeTags 的情况下重写示例时,matches始终使用它的no大小写并返回 false:

结果是:

是否可以在没有 TypeTags 的情况下重写此示例并获得与第一种情况相同的结果?

0 投票
2 回答
1590 浏览

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

考虑到这个问题:将无形可扩展记录传递给函数,特拉维斯的回答表明,每个将可扩展记录作为参数的函数都必须有一个隐式选择器作为参数。我想知道如果我们有很多此类函数,是否可以分解这些声明。例如:

谢谢

贝努瓦

12月10日编辑

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

  1. 与 foo1, foo2, foo3 关联的数据的真实类型没有被告知:因此,像 fun1 这样的函数不能使用与这些类型关联的任何方法。例如,即使 foo3 是一个 Double,它也不能取其平方根。
  2. 如果我用 ("foo1"->> "hello") :: ("foo2" -> 1)::("foo3" ->> 1.2)::HNiL 调用 fun1,结果是 (hello, 1, 1.2 ) 类型为 (selectors.s1.Out, selectors.s2.Out, selectors.s3.Out) 如果我尝试将 1 添加到最后一个值 (1.2),Scala 会抱怨它无法添加 Int 和选择器。 s3.Out ;但如果我写:

    我可以写:

    斯卡拉的答案是真的!

我试图以这种方式修改代码,希望传播类型,但这并不能解决问题。我什至不能用 (foo1->> "hello") :: (foo2 -> 1)::(foo3 ->> 1.2)::HNil 作为参数调用 fun1:

有没有进步的方法?

贝努瓦

0 投票
1 回答
106 浏览

scala - 使用带 Id 的自然变换 hmap

我想创建一个从 Class[A] 到 A 的 HMap,但我找不到一种看起来不难看的方法。我试过了:

但我得到一个编译错误,因为 Class[String], String 没有隐式。我可以通过使用 Id 显式键入参数来编译它:

不过,它并不是很有吸引力-有没有一种方法可以在不需要“:Id [A]”的情况下做到这一点?

0 投票
1 回答
841 浏览

scala - 使用 HLists 作为函数的参数

是否可以将 HList 作为函数参数传递?

这是我到目前为止所拥有的:

导致此错误:

0 投票
2 回答
996 浏览

scala - 压缩 HLists 的推断函数类型

感谢https://github.com/milessabin/shapeless/wiki/Feature-overview:-shapeless-2.0.0我了解如何压缩无形 HLists:

从 Shapeless 2.0.0-M1 导入一些东西:

创建两个 HList:

压缩它们:

现在尝试定义一个做同样事情的函数:

推断的返回类型是 Unit,实际上将 f 应用于 h1 和 h2 就是这样做的:

有没有办法定义 f 以便在这种情况下得到 ((5,6),(a,b)) ?

最终,我要做的是定义一个函数,它压缩两个 HList,然后映射它们,选择 _1 或 _2 基于抛硬币,这将产生另一个 HL。

在 REPL 中运行良好:

但是当我试图把它拉到一个函数中时,我被上述问题绊倒了。

谢谢!

0 投票
1 回答
201 浏览

scala - 在 poly 函数中键入擦除,scala

所以我想在 a 上创建一个 map 函数HList,但我需要检查应用函数中的一些条件。喜欢:

结果,我们丢失了有关元素的所有type信息t.head;顺便说一句,如果我们构建“干净”功能:

那么,显然,一切都好。

所以问题是:如何处理它,并制作这样的功能(如果可能的话)或者我应该寻找另一种方式?为什么这里可以进行类型擦除?

0 投票
2 回答
1223 浏览

scala - 将无形 HList 转换为更小的 HList

我有一个无形的 HList 具有以下结构:

我想转换成一个更简单的类型,从左到右附加相同类型的列表:

shapeless v1.2.4 中是否有一些内置功能?

0 投票
1 回答
87 浏览

scala - 同时使用 shapeless 和 Scalaz 6 - 冲突导入

我正在尝试定义这种同时使用 shapeless 和 Scalaz 的方法,但是它从 scalaz 中为地图拾取隐式,而不是某些东西(也许是“隐式宏”?我什至不知道那是什么) ) 从无形:

日食 说:

如何更改此代码以使其编译?