问题标签 [hlist]

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 投票
1 回答
590 浏览

scala - 使用 shapeless 的多态映射函数

我正在尝试以类型安全的方式进行这项工作:

到目前为止,除了无形之外,我还没有找到另一种使这种类型安全的方法。

我确实知道 slick 和其他 ORM,所以请不要把我送到那里。

HList 似乎是一种传递异构对象并返回具有特定类型的值列表的方法。

我试图做这样的事情:

只是重申什么是必不可少的:

HList/Shapeless 可能是解决问题的候选者,但不是本练习的目标。我的目标是让函数的返回类型与传入的变量类型和参数数量相对应。

如果我的小实用程序的用户不需要了解 HList,那将是理想的,但这不是真正的要求。

重要的部分是让结果的类型与 params 的类型匹配:

更准确地说是上述参数的有效载荷类型,因此 res 的类型是 T(String, Integer, ....) 。


让我再做一个澄清。我想为任意数量创建一个方法,并避免为每个参数计数创建一个函数。如果我对 22 种方法没问题,它看起来像这样:

然后我不需要 shapeless 或 HList,因为所有可能的元组都将被显式定义。

实际上查看这 3 个签名 - 将它们设为 22 会花费一些时间,但会避免无形的依赖,它们的实现也将是单行的。也许我应该只花 30 分钟手动完成(或使用小脚本)。

0 投票
1 回答
54 浏览

haskell - 使顶级模式单态

我得到了想要的qroto :: (Char, [Char]),但proto :: (t, t1)太笼统了。更重要的是,这导致px :: (Char, t)而不是qx :: (Char, [Char]).

更大的问题是我试图减少Data.HList.Variant.mkVariant的第三个参数所需的类型注释。

0 投票
1 回答
373 浏览

haskell - 如何在 Haskell 中连接幻像类型中的元组?

我正在编写一个 SQL 组合器,它允许将 SQL 片段组合为 Monoid。我大致有这样的类型(这是一个简化的实现):

这让我可以轻松地组合我经常使用的 SQL,并执行以下操作:

这很好用,我很满意。现在我使用MySQL.Simple并执行它需要知道行的类型。

这就是为什么我需要

为了避免手动添加这个显式(且无用)的类型签名,我有以下想法:我添加了一个幻像类型SQLFragment并使用它来强制函数的类型query_。所以我可以有这样的东西

ETC ...

那我可以做

我的第一个问题是我不能再使用<>了,因为不再SQLFragment a是 aMonoid了。第二个是如何实现我的 new<>以正确计算幻像类型?

我找到了一种我认为丑陋的方法,我希望有一个更好的解决方案。我创建了一个typed versionofSQLFragment并使用了一个HList.

然后我创建一个新的typed运算符:!<>! 我不理解类型签名,所以我不写它

现在我无法组合我的类型片段并跟踪类型(即使它还不是元组,但确实很奇怪)。

要将这种奇怪的类型转换为元组,我创建了一个类型族:

并为一些元组实例化它

另一种解决方案可能是使用类型族并手动编写每个元组组合

ETC ...

那行得通。我可以使用Result家庭编写我的函数

我的主程序如下所示:

它有效!

但是,有没有更好的方法来做到这一点,尤其是不使用HList并且尽可能少的扩展?

如果我以某种方式“隐藏”了幻像类型(这样我就可以拥有一个真实的Monoid并且能够使用<>而不是!<>!)有没有办法让这个类型回来?

0 投票
1 回答
183 浏览

haskell - 类型族卡在使用函数依赖的等效类型可以简化的地方

我正在尝试为 HList实现map tagSelf :: [a] -> [Tagged a a]并 具有良好的类型推断属性。map untag :: [Tagged a a] -> [a]TF 版本很接近,但我有一个类型函数卡住的情况,而 FD 版本简化了类型就好了。

这是一个独立的示例,可以使用 doctest 运行。

是否有可能在保持与 FD 版本相同的行为的同时获得更好的 TF 语法?

0 投票
1 回答
323 浏览

scala - 为什么 Shapeless 中的 _0 Nat 是一个类而不是一个对象?

我试图理解无形,我遇到了这个:

_0是一个特殊且独特的情况,例如Nila List_0没有前任。为什么它不是一个对象/案例对象(它是一个单例)? HLists 似乎这样做:

0 投票
1 回答
489 浏览

scala - 如何将 HList 映射到 List[Type]、List[TypeTag] 或 List[String]

我正在使用 Scala REPL 及其绑定方法。不幸的是,它需要一个 ClassTag 来擦除类型一些类型信息,例如List[Int]变成List[_]. 所以我想将 HList 传递给我的 REPL 包装器,并将类型作为字符串传递给绑定方法。为此,我必须将 HList 映射到字符串列表。

上面的代码不起作用。一方面,我不能使用 Tuple2。解决这个问题应该不会太难。但是,typeOf[T] 需要一个隐式 TypeTag。知道我该怎么做吗?能show帮忙吗?

谢谢你的帮助。

0 投票
1 回答
114 浏览

haskell - Monoid Instance 表单 HList Record 不起作用

我正在尝试为其定义一个Monoid实例,HList Record但我收到了重叠的实例错误消息。我的尝试(代码看起来很复杂,但基本上就是元组实例)

错误信息:

这意味着什么 ?我怎么解决这个问题 ?(我正在使用 GHC 7.6.3)

0 投票
1 回答
385 浏览

scala - 如何在 HLists 上实现 zipWithIndex

写算法HList,我需要一个zipWithIndex函数。它现在不在 shapeless 库中,所以我决定实现它。

很明显,它可以实现为

哪里indexesHList索引(0..n),可能可以通过这种方式获得:

这里的问题是Nat没有until方法。我还没有找到任何Witness可用于HList索引的HList.map.

我可以用什么方法来获取从until开始HListNats ?Nat._0hlist.length

0 投票
1 回答
175 浏览

json - Json Argonaut 对于案例类来说太大了

有一个我无法影响的 API,它有一个 JSON 结果对象,其成员有 23 个字段。案例类的范式不起作用,因为有 22 个限制。我见过 Slick 和其他库使用 HLists 来解决这个问题。有没有办法在 Argonaut 中做到这一点?如果是这样,请给我一段示例代码以供利用。谢谢!

0 投票
1 回答
868 浏览

scala - 选择无形的 HList 而不是案例类

在 Scala 中使用无形 HList 与案例类相比有什么优势?在什么情况下你不想使用 HList?