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

scala - 如何正确键入注释此 HList?

在尝试编译上述代码时,我收到以下编译器错误:

我在这里做错了什么?对上述内容进行类型注释的正确方法是HList什么?

PS:当我删除类型注释时,代码编译得很好。

0 投票
1 回答
438 浏览

haskell - 基本 Haskell 单态/多态问题 (HList)

我是 Haskell 和 Stackoverflow 菜鸟,这是我的第一个可能非常基本的 Haskell 问题。

这是有道理的,即使 r1 和 r2 在 r 中是多态的,rPair 也会根据类型签名对齐它们的 r 类型。这种“对齐”是否有技术术语?

如果传递的 R 在 r 中是单态的,则 rCons 效果很好,可以根据需要限制列表的 r 类型。但如果它们在 r 中是多态的,它不会像 rPair 那样对齐它们,并给出错误(在上面定义 rc)。

我对为什么会这样有一个模糊的直觉,但我的问题分为两部分。有人可以清楚地解释这种现象吗?我将如何编写一个 rCons 以使以下内容成立?

谢谢,_c

0 投票
3 回答
4807 浏览

scala - 可以在 Scala HList 上执行 Map

我现在已经做了一些 HList 的实现。一个基于 Daniel Spiewak 在 Scala 之地的高级巫术演讲,另一个基于 Apocalisp 博客中的一篇文章。目标是有一个异质列表,其中在主要类型中不是异质的,而是更高类型的。例如:

我将能够在列表中进行映射以执行请求并生成更高类型的异构列表。所以:

应该等于

可悲的是,我所有的尝试都导致了 Any 的 HList。这是最近尝试的代码:

另一种尝试是基于 Apocalisp 版本,它使用 fold 创建一个新的 HList,它再次产生了一个 Any 类型的 HList。任何提示将不胜感激。

0 投票
3 回答
606 浏览

scala - Scala编译时递归?

由于对我昨天发布的关于 Scala 元组的问题的一些有用答案,我一直在研究 Scala HLists。我想从那个问题重新散列一个 C++ 示例来问另一个问题:

在 C++ 中,可以实现使用模板特化终止的编译时递归。我经常在 boost 元组上执行此操作,就像 Scala/Haskell HLists 一样,它是通过多次组合通用“cons”类型来构造的,每个相关类型一次并以 null_type 终止。所以这:

在引擎盖下实现为:

然后我们可以编写一对函数,在编译时在这个结构上递归,当第二个更专业的函数匹配最终的 cons 类型时终止。一个简单的例子,计算元素的数量如下所示:

至关重要的是,这种模式通常用于您想要对每种元组元素类型(在我的示例中未说明)执行不同操作的情况:在 C++ 中,编译时递归是必不可少的,因为一旦代码运行,类型信息就会丢失出于所有有用的目的。

我的问题是,Scala HList 是否有类似的可能,例如

我知道在 JVM 上运行的 Scala 具有反射功能 - 因此大概可以使用运行时递归和使用清单和模式匹配的函数来实现。但我很想知道是否可以使用编译时递归来做类似于 C++ 示例的事情?

0 投票
3 回答
2762 浏览

scala - 在 Scala 中使用 foldLeft 将参数列表应用于 curried 函数

是否可以foldLeft在参数列表上执行 a ,其中提供给折叠的初始值是一个完全柯里化的函数,运算符是apply,并且列表是要传递给函数的参数列表f

例如,假设 f 定义为:

我们当然可以直接使用:

或者 curry 并一次应用一个参数:

乍一看,这看起来像是foldLeft.

我第一次尝试描述这个apply使用顺序foldLeft看起来像:

但是,这会产生以下错误:

我对错误消息的阅读是类型推断需要一些提示g

我正在寻找的解决方案在我的原始表达式中保持不变,除了以下类型g

我的第一个想法是联合类型在这里会很有用。我已经看到 Miles Sabin 使用 Curry-Howard 推导联合类型,所以如果第一个预感是真的,那么我似乎拥有解决问题所需的基本机制。

但是:即使联合类型是答案,如果我可以参考“从函数的完全柯里化类型到除了最后一个参数之外的所有类型的柯里化函数类型的所有类型的联合”,这将是有用的。换句话说,一种转换类型的方法:

进入联合类型:

作为上述类型将很有用g

做 a foldLefton aList将讨论限制在T1通过Tn-1都相同的情况。像这样的符号

将描述我想要提供的类型g

我要询问的具体情况不需要任意长的链,因此我们可以使用

但是,展望想要对不相等的类型链执行此操作,也许一些将链切分成所有后缀集的类型的神奇功能更有用:

目前,实现这一点远远超出了我的 Scala 能力。任何有关如何这样做的提示将不胜感激。这是否可以通过 Scala 现有类型系统的高级使用或通过编译器插件来完成,或者两者都没有,我不知道。

正如在下面的评论中所指出的,将结果称为“联合类型”并不完全适合此用例。我不知道还能怎么称呼它,但这是我目前最接近的想法。其他语言对这个想法有特殊的支持吗?这将如何在 Coq 和 Agda 中工作?

命名这个问题并理解它在更大的图景(类型理论、可判定性等)方面的位置对我来说比有一个有效的实现更重要ANSWER,尽管两者都很好。奖金指向任何可以与 Scalaz、Monoids 或一般范畴理论建立联系的人。

0 投票
1 回答
117 浏览

haskell - HList 成员的自动 HEq 实例

我正在试验基于HList的类型化异构列表。

我已经定义了以下内容:

bIndex期望值为 1。相反,我收到以下错误:

GHC(7.4.1)似乎无法自动推断实例

有没有办法做到这一点?

0 投票
1 回答
270 浏览

perl - Perl HList:更改单个项目的背景

我试图提醒用户某些数据已更改并且需要保存。数据显示在 Perl 的 Tk::HList 框中。我希望我能做到:

甚至:

但两者都抛出

我已经看到了使用 ItemStyle 的想法,但没有明确的答案是否有效,或者它是否是最好的(也是唯一的)解决方案。是否有另一种方法可以突出显示某些行以提醒用户?

0 投票
4 回答
18224 浏览

scala - HLists 只不过是一种复杂的元组编写方式吗?

我真的很想找出差异在哪里,更一般地说,是找出不能使用 HLists 的规范用例(或者更确切地说,不会比常规列表产生任何好处)。

(我知道TupleNScala 中有 22 个(我相信),而一个只需要一个 HList,但这不是我感兴趣的那种概念差异。)

我在下面的文字中标记了几个问题。实际上可能没有必要回答它们,它们更多是为了指出我不清楚的事情,并引导讨论朝着某些方向发展。

动机

我最近在 SO 上看到了几个答案,人们建议使用 HLists(例如,由Shapeless提供),包括对此问题的已删除答案。它引发了这种讨论,进而引发了这个问题。

介绍

在我看来,只有当您静态地知道元素的数量及其精确类型时,hlist 才有用。这个数字实际上并不重要,但您似乎不太可能需要生成一个包含不同但静态精确已知类型的元素的列表,但您并不静态知道它们的数字。问题 1:你甚至可以写一个这样的例子吗,例如,在一个循环中?我的直觉是,拥有一个静态精确的 hlist 和一个静态未知数量的任意元素(相对于给定的类层次结构是任意的)是不兼容的。

HLists 与元组

如果这是真的,即您静态地知道数字和类型 -问题 2:为什么不只使用 n 元组?当然,您可以对HList 进行类型安全地映射和折叠(您也可以,但不是类型安全地,借助productIterator直接执行操作。

另一方面,如果f您在 hlist 上映射的函数是如此通用以至于它接受所有元素 -问题 3:为什么不使用它 via productIterator.map?好的,一个有趣的区别可能来自方法重载:如果我们有几个重载f的 's,具有由 hlist 提供的更强类型信息(与 productIterator 相比)可以允许编译器选择更具体的f. 但是,我不确定这是否真的适用于 Scala,因为方法和函数并不相同。

HLists 和用户输入

基于相同的假设,即您需要静态知道元素的数量和类型 -问题 4:可以在元素依赖于任何类型的用户交互的情况下使用 hlists 吗?例如,想象用循环内的元素填充 hlist;从某处(UI、配置文件、actor 交互、网络)读取元素,直到满足特定条件。hlist 的类型是什么?与接口规范 getElements: HList[...] 类似,它应该与静态未知长度的列表一起使用,并且允许系统中的组件 A 从组件 B 获取这样的任意元素列表。

0 投票
1 回答
457 浏览

haskell - Haskell:HList 和可选参数

我一直在尝试使用HList来创建记录。

我一直在使用HList-GHCSyntax中定义的运算符。

到目前为止它工作得很好,让我可以写这样的东西:

这允许我执行以下操作:

以及以下内容:

按预期抛出编译错误。如果需要,这很好param3用,因为我得到编译时参数检查。

但我也想处理param3可选的情况。我怎样才能做到这一点?


编辑:以下似乎有效(Empty是一个空类型):

但我真的不知道如何检查Empty调用代码。

0 投票
1 回答
221 浏览

haskell - 是否可以为此 DataKinds 支持的异构列表实现删除 OverlappingInstances?

随着最近有关 HaskellDB 的帖子,我有动力再次研究 HList。正如我们现在-XDataKinds在 GHC 中所拥有的,它实际上有一个异构列表的示例,我想研究 HList 与 DataKinds 的外观。到目前为止,我有以下内容:

这按预期工作,但我在这个项目中的目标是尝试尽可能不使用类型类。所以这里有2个问题。首先,是否可以在(=?)没有类型类的情况下编写(记录字段访问器函数)?如果不是,是否可以在没有重叠实例的情况下编写它?

我想我的第一个问题是不可能的,但也许第二个问题是可能的。我很想听听人们的想法!