问题标签 [higher-order-types]

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 投票
3 回答
184 浏览

haskell - 如何在 Haskell 中定义一系列类型相关的函数

这是一个(系列)Haskell 问题。我对 Haskell 相当陌生。

假设我们有一个 4 元组 (a1,a2,a3,a4)。我们如何定义一个函数,kth给出这个元组中的第 k 个元素?例子,

如果a1、a2、a3、a4的类型相同,那么它的定义就比较简单了。例如,如果它们都是整数:

我怀疑为什么这不简单是因为 Haskell 必须提前知道类型。在库函数fstandsnd中,Haskell 知道输出类型是形式的第一个元素的类型,输出类型是后者的第二个元素的类型。因此,没有歧义。在kth中,输出类型取决于第二个输入,因此 Haskell 无法根据语法进行类型检查。

现在,假设我们有一个第 n 个元组 (a1,a2,...,an)。我们可以定义一个长度函数族,使得

0 投票
1 回答
162 浏览

haskell - 广义 HM 与高阶统一

AFAIK,Hindley-Milner 类型系统中使用的统一可以通过在构造函数位置允许类型 var 并在这种情况下放宽 arity 约束来推广以统一更高种类的类型:

我想还涉及种类,但我不知道如何。

以我的一点经验,我会说这对于高级类型的声音统一来说已经足够了。与高阶统一的主要区别可能是

  • 广义的HM是可判定的,HOU不是一般的
  • 广义的 HM 受到更多限制,即拒绝在 HOU 中合法的类型

虽然我以某种方式回答了我的问题,高阶统一给了我们什么,但我不知道应用高阶统一时涉及哪些(简化的)规则。该算法与广义 HM 有何不同?

0 投票
0 回答
21 浏览

frp - 高阶 FRP 的价值是多少?

Elm 的创建者 Evan Czaplicki 就多种形式的函数式反应式编程进行了演讲 @ https://youtu.be/Agu6jipKfYw。不同实现之间的区别之一是使用高阶 FRP,但我仍然看不到它的价值。

给定一个定义为随时间变化的值的信号:

那么更高的 FRP 将是

这相当于

但这在现实世界中代表什么?这将解决常规 FRP 无法解决的哪些问题?

0 投票
2 回答
193 浏览

typescript - 将参数类型作为类型参数传递给 TypeScript 或 Flow 中的另一种类型

出于演示目的,请考虑以下类型:

例如,Convert<"12">结果为"one-two-".

现在我想让它更通用,并接受上面的“翻译器”ToEnglish作为参数:

这不起作用:Type 'Translator' is not generic. ts(2315)

如果我尝试写:

我得到:',' expected. ts(1005)<_>.

:有没有办法在 TypeScript、Flow 或另一个 JavaScript 超集中以某种方式将参数(通用)类型作为参数(参数)传递给另一种类型?
类似于高阶函数,但针对类型。

0 投票
1 回答
83 浏览

haskell - 为什么我只能在类型参数位置传递部分应用的类型构造函数?

这可能是一个愚蠢的问题,但我无法弄清楚以下行为的基本规则:

f应用到aa b分别bar导致类错误并因此被拒绝是完全有道理的。但为什么会被foo接受?

0 投票
1 回答
141 浏览

scala - Scala 3中的递归高阶函数类型

我想为一个函数定义一个类型,该函数执行某些操作,然后返回另一个相同类型的函数[可以是它自己]。显而易见的想法不起作用(“非法循环类型引用”错误):

我在这里有什么明显的遗漏吗?我也不明白如何表达“函数返回自身”的想法。

0 投票
2 回答
86 浏览

c++ - 类型列表上的编译时映射

我正在寻找一种惯用的方法来为类型列表中的每个元素应用类型级转换。到目前为止,我想出了以下内容,它按预期工作:

测试:

现在我想概括MapVariant接受使用类型列表参数化的任意容器,而不仅仅是std::variant(例如,std::tuple)。我天真的解决方案不起作用:

这是一种更接近原始方法的更详细的方法,但也是功能失调的:

Clang 说“模板模板参数的模板参数必须是类模板或类型别名模板”。我知道编译器无法解包TestVariant,因为在定义时,某些类型信息显然丢失了using,但我不明白如何解决这个问题。

有可能做到这一点吗?