问题标签 [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.
scala - 使用 shapeless 的多态映射函数
我正在尝试以类型安全的方式进行这项工作:
到目前为止,除了无形之外,我还没有找到另一种使这种类型安全的方法。
我确实知道 slick 和其他 ORM,所以请不要把我送到那里。
HList 似乎是一种传递异构对象并返回具有特定类型的值列表的方法。
我试图做这样的事情:
只是重申什么是必不可少的:
HList/Shapeless 可能是解决问题的候选者,但不是本练习的目标。我的目标是让函数的返回类型与传入的变量类型和参数数量相对应。
如果我的小实用程序的用户不需要了解 HList,那将是理想的,但这不是真正的要求。
重要的部分是让结果的类型与 params 的类型匹配:
更准确地说是上述参数的有效载荷类型,因此 res 的类型是 T(String, Integer, ....) 。
让我再做一个澄清。我想为任意数量创建一个方法,并避免为每个参数计数创建一个函数。如果我对 22 种方法没问题,它看起来像这样:
然后我不需要 shapeless 或 HList,因为所有可能的元组都将被显式定义。
实际上查看这 3 个签名 - 将它们设为 22 会花费一些时间,但会避免无形的依赖,它们的实现也将是单行的。也许我应该只花 30 分钟手动完成(或使用小脚本)。
haskell - 使顶级模式单态
我得到了想要的qroto :: (Char, [Char])
,但proto :: (t, t1)
太笼统了。更重要的是,这导致px :: (Char, t)
而不是qx :: (Char, [Char])
.
更大的问题是我试图减少Data.HList.Variant.mkVariant的第三个参数所需的类型注释。
haskell - 如何在 Haskell 中连接幻像类型中的元组?
我正在编写一个 SQL 组合器,它允许将 SQL 片段组合为 Monoid。我大致有这样的类型(这是一个简化的实现):
这让我可以轻松地组合我经常使用的 SQL,并执行以下操作:
这很好用,我很满意。现在我使用MySQL.Simple
并执行它需要知道行的类型。
这就是为什么我需要
为了避免手动添加这个显式(且无用)的类型签名,我有以下想法:我添加了一个幻像类型SQLFragment
并使用它来强制函数的类型query_
。所以我可以有这样的东西
ETC ...
那我可以做
我的第一个问题是我不能再使用<>
了,因为不再SQLFragment a
是 aMonoid
了。第二个是如何实现我的 new<>
以正确计算幻像类型?
我找到了一种我认为丑陋的方法,我希望有一个更好的解决方案。我创建了一个typed version
ofSQLFragment
并使用了一个HList
.
然后我创建一个新的typed
运算符:!<>!
我不理解类型签名,所以我不写它
现在我无法组合我的类型片段并跟踪类型(即使它还不是元组,但确实很奇怪)。
要将这种奇怪的类型转换为元组,我创建了一个类型族:
并为一些元组实例化它
另一种解决方案可能是使用类型族并手动编写每个元组组合
ETC ...
那行得通。我可以使用Result
家庭编写我的函数
我的主程序如下所示:
它有效!
但是,有没有更好的方法来做到这一点,尤其是不使用HList
并且尽可能少的扩展?
如果我以某种方式“隐藏”了幻像类型(这样我就可以拥有一个真实的Monoid
并且能够使用<>
而不是!<>!
)有没有办法让这个类型回来?
haskell - 类型族卡在使用函数依赖的等效类型可以简化的地方
我正在尝试为 HList实现map tagSelf :: [a] -> [Tagged a a]
并
具有良好的类型推断属性。map untag :: [Tagged a a] -> [a]
TF 版本很接近,但我有一个类型函数卡住的情况,而 FD 版本简化了类型就好了。
这是一个独立的示例,可以使用 doctest 运行。
是否有可能在保持与 FD 版本相同的行为的同时获得更好的 TF 语法?
scala - 为什么 Shapeless 中的 _0 Nat 是一个类而不是一个对象?
我试图理解无形,我遇到了这个:
_0
是一个特殊且独特的情况,例如Nil
a List
。_0
没有前任。为什么它不是一个对象/案例对象(它是一个单例)? HList
s 似乎这样做:
scala - 如何将 HList 映射到 List[Type]、List[TypeTag] 或 List[String]
我正在使用 Scala REPL 及其绑定方法。不幸的是,它需要一个 ClassTag 来擦除类型一些类型信息,例如List[Int]
变成List[_]
. 所以我想将 HList 传递给我的 REPL 包装器,并将类型作为字符串传递给绑定方法。为此,我必须将 HList 映射到字符串列表。
上面的代码不起作用。一方面,我不能使用 Tuple2。解决这个问题应该不会太难。但是,typeOf[T] 需要一个隐式 TypeTag。知道我该怎么做吗?能show
帮忙吗?
谢谢你的帮助。
haskell - Monoid Instance 表单 HList Record 不起作用
我正在尝试为其定义一个Monoid
实例,HList Record
但我收到了重叠的实例错误消息。我的尝试(代码看起来很复杂,但基本上就是元组实例)
错误信息:
这意味着什么 ?我怎么解决这个问题 ?(我正在使用 GHC 7.6.3)
scala - 如何在 HLists 上实现 zipWithIndex
写算法HList
,我需要一个zipWithIndex
函数。它现在不在 shapeless 库中,所以我决定实现它。
很明显,它可以实现为
哪里indexes
是HList
索引(0..n),可能可以通过这种方式获得:
这里的问题是Nat
没有until
方法。我还没有找到任何Witness
可用于HList
索引的HList.map
.
我可以用什么方法来获取从until开始HList
的Nat
s ?Nat._0
hlist.length
json - Json Argonaut 对于案例类来说太大了
有一个我无法影响的 API,它有一个 JSON 结果对象,其成员有 23 个字段。案例类的范式不起作用,因为有 22 个限制。我见过 Slick 和其他库使用 HLists 来解决这个问题。有没有办法在 Argonaut 中做到这一点?如果是这样,请给我一段示例代码以供利用。谢谢!
scala - 选择无形的 HList 而不是案例类
在 Scala 中使用无形 HList 与案例类相比有什么优势?在什么情况下你不想使用 HList?