问题标签 [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.
java - Java中的高级泛型
假设我有以下课程:
现在我想介绍一个通用论点,对 Expr 的使用进行抽象:
但 Eclipse 不喜欢这样:
F 类型不是通用的;它不能用参数 <Fix<F>> 参数化
这是可能的,还是我忽略了导致这个特定实例中断的东西?
一些背景信息:在 Haskell 中,这是编写泛型函数的常用方法;我正在尝试将其移植到 Java。上例中的类型参数 F 具有种类 * -> * 而不是通常的种类 *。在 Haskell 中,它看起来像这样:
haskell - Haskell - 在数据声明中指定种类
在这份声明中
Haskell 推断Const
是* -> *
. 是否可以改为Const
使用类型构造函数,所以它会是(* -> *) -> *
?理想情况下,它应该是a -> *
,但没有多态种类。该线程显示了一种解决方案 - 添加未使用的构造函数。自 2002 年以来情况是否发生了变化?
c++ - 使用 C++ 的高级类型
这个问题适用于同时了解 Haskell(或任何其他支持高级类型的函数式语言)和 C++ 的人......
是否可以使用 C++ 模板对更高种类的类型进行建模?如果是,那么如何?
编辑 :
从托尼莫里斯的这个演讲中:
高阶多态性:
Java 和 C# 等语言具有一阶多态性,因为它们允许我们对类型进行抽象。例如
List<A>
,可以具有reverse
适用于任何元素类型(的A
)的功能。更实用的编程语言和类型系统也允许我们对类型构造函数进行抽象。
该特征称为高阶(或更高种类)多态性。
例子 :
具有发明的高阶多态性表示法的伪 Java
scala - scala中高阶多态性的常见做法
我试图通过实现一个描述 monad 的非常基本的接口来掌握 scala 中的高阶多态性,但我遇到了一个我不太了解的问题。
我用 C++ 实现了相同的代码,代码如下所示:
当尝试对 scala 做同样的事情时,我失败了:
编译器抱怨:
我在这里做错了什么?似乎有一个关于 scala 类型构造函数的基本概念我似乎不了解。
问候, raichoo
scala - Scala 中用于具有继承返回类型的集合的最小框架
假设一个人想要构建一个新颖的泛型类,Novel[A]
. 这个类将包含许多有用的方法——也许它是一种集合——因此你想继承它。但是您希望方法返回子类的类型,而不是原始类型。在 Scala 2.8 中,为了使该类的方法返回相关子类而不是原始子类,需要做的最少工作量是多少?例如,
如果你想Novel
协变,这个最小量会改变吗?
(除其他外,2.8 集合做到了这一点,但它们也以更花哨(和有用)的方式使用返回类型——问题是如果一个人只想要这个子类型-总是-返回-子类型,那么可以摆脱多少框架特征。)
编辑:假设在上面的代码中reverse
进行了复制。如果进行就地修改然后返回自己,则可以使用this.type
,但这不起作用,因为副本不是this
。
Arjan 链接到另一个建议以下解决方案的问题:
这基本上取决于类型系统以获得我们想要的东西。但这并不是一个真正的解决方案,因为既然我们对类型系统撒了谎,编译器就无法帮助我们确保当我们认为我们确实得到了ShortStory
回报时。(例如,我们不必reverse
在上面的示例中重写以使编译器满意,但我们的类型不会是我们想要的。)
c# - C# 4.0 中泛型类型参数的方差是否更接近于更高种类的类型?
我们知道实现类仍然是不变的,尽管它们的接口是可变的。但是我在询问,cov/逆变是更接近参数多态性还是这是两个独立的概念?
haskell - 多态种类的用途是什么?
多态类型是 Haskell 类型系统的扩展,由 UHC支持,允许
被键入(kinded?)为a -> (a -> *) -> *
。它们有什么用?
scala - 我们可以在 Scala 中定义一个更高种类的类型级标识函数吗?
在 Scala 中,我们可以为低类类型定义类型级标识函数,如下所示,
我们也可以为更高种类的类型定义类似的东西吗?IE。我们可以填空吗,
这样类似于 HKId[List] 的东西让我们回到 List 类型的构造函数?
绑定免费名称,例如,
可能会导致我们期望更高种类的类型级别身份看起来像,
但 scalac 抱怨在 RHS 上找不到类型 X。
是否有一些聪明的编码可以解决问题?还是现在不可能?
scala - 更高种类类型的隐式参数解析
考虑以下代码:
这可行,但我需要将 Some(42) 键入为 Option[Int],否则将无法解析隐式对象 OptionBar(因为需要使用 Bar[Some])。有没有办法避免显式键入,以便即使我用 Some 或 None 提供测试,我也会在测试中获得隐式 OptionBar 对象?
[澄清]
- 我在这里使用了 Option 作为示例,如果我有
Bar
一个抽象类等,它也应该可以工作。 - 当其他不相关的条在范围内时,该解决方案也应该起作用,例如
implicit object listBar extends Bar[list]
[更新]
似乎使 Bar 的参数逆变可以解决问题:
但当然这是对 Bar 可能性的严重限制,所以我仍然希望有更好的答案。
scala - 如何在 Scala 中将通配符用于更高种类的类型?
假设我有这个特质
我无法构造任何采用 Ctx 的方法签名,其中第二个类型参数未指定(通配符)。例如这个:
不编译 ( "error: _$2 takes no type parameters, expected: one"
)。我也做不到
( "error: _$2 does not take type parameters"
)。我错过了什么?