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

scala - 模式匹配类型不匹配错误

我正在尝试构造一个 type IOIO[File, String]它代表类似于 File 操作的东西,它将返回 String 作为结果。我有以下问题:

我希望v是 type A,我在这里错过了什么吗?我怀疑它与那些+和相关-,但我看不到问题......


更多细节:我怀疑问题隐藏在类型差异中的原因是因为如果 +A成为A-F成为Fin ,代码编译得很好trait IO,例如:

正如@igx 所建议的那样,使用v.asInstanceOf[A]可以强制它编译,但是由于我在这里只提出了一个最小化的问题,所以我必须添加asInstanceOf很多地方才能使它工作。

另外,我很想知道这个错误背后的原因~~

0 投票
7 回答
10738 浏览

scala - 高级类型什么时候有用?

我在 F# 中做开发已经有一段时间了,我喜欢它。但是,我知道 F# 中不存在的一个流行词是高级类型。我已经阅读了有关高级类型的材料,并且我想我理解它们的定义。我只是不确定它们为什么有用。有人可以提供一些示例,说明哪些高级类型在 Scala 或 Haskell 中变得容易,需要 F# 中的解决方法?同样对于这些示例,如果没有更高种类的类型(或 F# 中的反之亦然),解决方法会是什么?也许我只是习惯于解决它,以至于我没有注意到该功能的缺失。

(我认为)我明白了,而不是myList |> List.map fmyList |> Seq.map f |> Seq.toList更高种类的类型允许您简单地编写myList |> map f它,它会返回一个List. 这很棒(假设它是正确的),但似乎有点小?(难道不能简单地通过允许函数重载来完成吗?)我通常转换为Seq无论如何,然后我可以转换为我想要的任何东西。同样,也许我只是太习惯于解决它。但是,有没有任何例子可以说明更高种类的类型真的可以在击键或类型安全方面为您节省时间?

0 投票
1 回答
169 浏览

scala - 没有协变注释的高级存在

当尝试在 Scala 中使用更高种类的存在时,我遇到了以下问题:

按照编译器的建议向 H 添加协变注释是可行的。如果我不希望 H 是协变的,有没有办法解决这个问题?

0 投票
2 回答
140 浏览

scala - 子类型中的压倒性差异

有人可以向我解释为什么示例 1 可以编译但示例 2 没有吗?

示例 1:

示例 2:

示例 2 无法编译并出现以下错误消息:“类型参数 (A) 的种类不符合 trait Foo 中类型参数 (类型 A) 的预期类型。A 的类型参数与类型 A 的预期参数不匹配: type _(在 trait Bar 中)是不变的,但 type _(在 trait Foo 中)被声明为协变的”

0 投票
1 回答
67 浏览

scala - HOMap 实现示例

我正在观看Daniel Spiewak 的这个视频,并试图从中实现有关更高种类的示例。这是我得到的:

不幸的是,启动这个我得到类型不匹配错误:

我的问题:

  1. 我怎样才能解决这个问题?我完全理解我只需要传入正确的类型,但是我在 Scala 中使用这种东西的经验很差,我无法弄清楚这一点。
  2. 为什么会发生这种情况?我的意思是该操作tuples: _*可能被广泛用于传递 to Map,但它以某种方式给出了一些奇怪的类型 -Main.$anon.HOMap.Pair[K,V]*而不是它应该给出的。
  3. 为什么那个例子不再有效?也许最近对 Scala 语言的一些更改改变了一些语法?

感谢您的回答!

0 投票
0 回答
150 浏览

scala - Scala 类型检查在模式匹配中对具有更高种类类型参数的案例类意外失败

让我定义一些类型

解决方法的自定义提取器https://issues.scala-lang.org/browse/SI-5900

及其用例

在使用 Scala 2.10.4 编译时,出现以下错误

Ez[Gen2]似乎符合Ez[g]

我想知道这是否是一个错误。或者,您能否解释原因或某些资源的链接?

0 投票
2 回答
260 浏览

scala - 涉及可变数量类型的运行时类型检查/模式匹配

我正在重新审视用于将异构基本类型分组在一起的通用包装器的问题。我正在使用类型成员,所以现在结构如下所示:

那么问题当然是测试特定对象,例如:

由于类型擦除,这不起作用。问题是我必须为对等点抽象类型参数,也就是说,有(大多数)对等点也有一个类型参数[S],但其他人没有。Inner因此,对and/or使用类型构造函数参数Outer是不可行的。

便宜的解决方案是需要实际的子类:

但我不喜欢这个解决方案,因为我会有很多不同的同伴,而且我不想为每个同伴创建专用的包装类。例如,如果我必须在每个子类中编写复制方法,复制这些对象也会变得很烦人。

所以我可能会留下类标签?如果我有以下两种类型参数不同的对等类型,这将如何解决:

?

0 投票
1 回答
93 浏览

scala - 定义类型构造函数来构建类型 lambda(部分应用类型)

我在定义类型构造函数以消除 Scala 中用于部分类型应用程序的可怕的 type-lambda 方法时遇到问题。鉴于:

假设我有这个方法:

我想这样定义它:

问题是:如何定义类型构造函数XXX[A]

我的想法是这样的:

但它只会产生

0 投票
1 回答
176 浏览

scala - 为更高种类的类型修复类型推断

好的,所以我有这个非常简单的设置:

还有一家工厂:

现在在实践中,f*** Scala 类型推断崩溃了:


所以我的下一个尝试是存在类型:

这给了我以下可爱的信息:

“类型 E1 有一个类型参数,但类型 E1 有一个”——嗯?


问题:如何定义工厂的apply方法来推断类型?

0 投票
2 回答
3958 浏览

c++ - 使用 Concepts Lite 为具有成员函数模板的类型指定概念

我正在尝试指定一个概念来约束具有使用 Concepts Lite 的成员函数模板的更高种类的类型。但是,我无法在技术规范教程中找到处理概念中模板化语句的子句。

这是怎么做到的?

HKT示例:假设我有一个带有成员函数模板的更高种类的类型F

现在我想指定一个概念来约束这些更高种类的类型:

请注意,我可以执行以下操作:

但这意味着我需要U在约束站点知道。

我真的不在乎替换给定值是否U失败,尽管我知道为什么这可能是一个问题:例如应用约束以确保您的函数不会失败然后失败导致约束得到满足但在实例化时成员函数模板中的替换失败(如果成员函数模板受到约束,会有帮助吗?)。