问题标签 [higher-kinded-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 投票
6 回答
5663 浏览

java - Java中的高级泛型

假设我有以下课程:

现在我想介绍一个通用论点,对 Expr 的使用进行抽象:

但 Eclipse 不喜欢这样:

F 类型不是通用的;它不能用参数 <Fix<F>> 参数化

这是可能的,还是我忽略了导致这个特定实例中断的东西?

一些背景信息:在 Haskell 中,这是编写泛型函数的常用方法;我正在尝试将其移植到 Java。上例中的类型参数 F 具有种类 * -> * 而不是通常的种类 *。在 Haskell 中,它看起来像这样:

0 投票
1 回答
702 浏览

haskell - Haskell - 在数据声明中指定种类

在这份声明中

Haskell 推断Const* -> *. 是否可以改为Const使用类型构造函数,所以它会是(* -> *) -> *?理想情况下,它应该是a -> *,但没有多态种类。该线程显示了一种解决方案 - 添加未使用的构造函数。自 2002 年以来情况是否发生了变化?

0 投票
2 回答
9817 浏览

c++ - 使用 C++ 的高级类型

这个问题适用于同时了解 Haskell(或任何其他支持高级类型的函数式语言)和 C++ 的人......

是否可以使用 C++ 模板对更高种类的类型进行建模?如果是,那么如何?

编辑 :

从托尼莫里斯的这个演讲中:

高阶多态性:

  • Java 和 C# 等语言具有一阶多态性,因为它们允许我们对类型进行抽象。例如 List<A>,可以具有reverse适用于任何元素类型(的 A)的功能。

  • 更实用的编程语言和类型系统也允许我们对类型构造函数进行抽象。

  • 该特征称为高阶(或更高种类)多态性。

例子 :

具有发明的高阶多态性表示法的伪 Java

0 投票
3 回答
1548 浏览

scala - scala中高阶多态性的常见做法

我试图通过实现一个描述 monad 的非常基本的接口来掌握 scala 中的高阶多态性,但我遇到了一个我不太了解的问题。

我用 C++ 实现了相同的代码,代码如下所示:

当尝试对 scala 做同样的事情时,我失败了:

编译器抱怨:

我在这里做错了什么?似乎有一个关于 scala 类型构造函数的基本概念我似乎不了解。

问候, raichoo

0 投票
3 回答
618 浏览

scala - Scala 中用于具有继承返回类型的集合的最小框架

假设一个人想要构建一个新颖的泛型类,Novel[A]. 这个类将包含许多有用的方法——也许它是一种集合——因此你想继承它。但是您希望方法返回子类的类型,而不是原始类型。在 Scala 2.8 中,为了使该类的方法返回相关子类而不是原始子类,需要做的最少工作量是多少?例如,

如果你想Novel协变,这个最小量会改变吗?

(除其他外,2.8 集合做到了这一点,但它们也以更花哨(和有用)的方式使用返回类型——问题是如果一个人只想要这个子类型-总是-返回-子类型,那么可以摆脱多少框架特征。)

编辑:假设在上面的代码中reverse进行了复制。如果进行就地修改然后返回自己,则可以使用this.type,但这不起作用,因为副本不是this

Arjan 链接到另一个建议以下解决方案的问题:

这基本上取决于类型系统以获得我们想要的东西。但这并不是一个真正的解决方案,因为既然我们对类型系统撒了谎,编译器就无法帮助我们确保当我们认为我们确实得到ShortStory回报时。(例如,我们不必reverse在上面的示例中重写以使编译器满意,但我们的类型不会是我们想要的。)

0 投票
1 回答
506 浏览

c# - C# 4.0 中泛型类型参数的方差是否更接近于更高种类的类型?

我们知道实现类仍然是不变的,尽管它们的接口是可变的。但是我在询问,cov/逆变是更接近参数多态性还是这是两个独立的概念?

0 投票
3 回答
1717 浏览

haskell - 多态种类的用途是什么?

多态类型是 Haskell 类型系统的扩展,由 UHC支持,允许

被键入(kinded?)为a -> (a -> *) -> *。它们有什么用?

0 投票
3 回答
1518 浏览

scala - 我们可以在 Scala 中定义一个更高种类的类型级标识函数吗?

在 Scala 中,我们可以为低类类型定义类型级标识函数,如下所示,

我们也可以为更高种类的类型定义类似的东西吗?IE。我们可以填空吗,

这样类似于 HKId[List] 的东西让我们回到 List 类型的构造函数?

绑定免费名称,例如,

可能会导致我们期望更高种类的类型级别身份看起来像,

但 scalac 抱怨在 RHS 上找不到类型 X。

是否有一些聪明的编码可以解决问题?还是现在不可能?

0 投票
2 回答
1370 浏览

scala - 更高种类类型的隐式参数解析

考虑以下代码:

这可行,但我需要将 Some(42) 键入为 Option[Int],否则将无法解析隐式对象 OptionBar(因为需要使用 Bar[Some])。有没有办法避免显式键入,以便即使我用 Some 或 None 提供测试,我也会在测试中获得隐式 OptionBar 对象?

[澄清]

  • 我在这里使用了 Option 作为示例,如果我有Bar一个抽象类等,它也应该可以工作。
  • 当其他不相关的条在范围内时,该解决方案也应该起作用,例如implicit object listBar extends Bar[list]

[更新]

似乎使 Bar 的参数逆变可以解决问题:

但当然这是对 Bar 可能性的严重限制,所以我仍然希望有更好的答案。

0 投票
2 回答
2964 浏览

scala - 如何在 Scala 中将通配符用于更高种类的类型?

假设我有这个特质

我无法构造任何采用 Ctx 的方法签名,其中第二个类型参数未指定(通配符)。例如这个:

不编译 ( "error: _$2 takes no type parameters, expected: one")。我也做不到

( "error: _$2 does not take type parameters")。我错过了什么?