问题标签 [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.
scala - 模式匹配类型不匹配错误
我正在尝试构造一个 type IO
,IO[File, String]
它代表类似于 File 操作的东西,它将返回 String 作为结果。我有以下问题:
我希望v
是 type A
,我在这里错过了什么吗?我怀疑它与那些+
和相关-
,但我看不到问题......
更多细节:我怀疑问题隐藏在类型差异中的原因是因为如果 +A
成为A
或-F
成为F
in ,代码编译得很好trait IO
,例如:
正如@igx 所建议的那样,使用v.asInstanceOf[A]
可以强制它编译,但是由于我在这里只提出了一个最小化的问题,所以我必须添加asInstanceOf
很多地方才能使它工作。
另外,我很想知道这个错误背后的原因~~
scala - 高级类型什么时候有用?
我在 F# 中做开发已经有一段时间了,我喜欢它。但是,我知道 F# 中不存在的一个流行词是高级类型。我已经阅读了有关高级类型的材料,并且我想我理解它们的定义。我只是不确定它们为什么有用。有人可以提供一些示例,说明哪些高级类型在 Scala 或 Haskell 中变得容易,需要 F# 中的解决方法?同样对于这些示例,如果没有更高种类的类型(或 F# 中的反之亦然),解决方法会是什么?也许我只是习惯于解决它,以至于我没有注意到该功能的缺失。
(我认为)我明白了,而不是myList |> List.map f
或myList |> Seq.map f |> Seq.toList
更高种类的类型允许您简单地编写myList |> map f
它,它会返回一个List
. 这很棒(假设它是正确的),但似乎有点小?(难道不能简单地通过允许函数重载来完成吗?)我通常转换为Seq
无论如何,然后我可以转换为我想要的任何东西。同样,也许我只是太习惯于解决它。但是,有没有任何例子可以说明更高种类的类型真的可以在击键或类型安全方面为您节省时间?
scala - 没有协变注释的高级存在
当尝试在 Scala 中使用更高种类的存在时,我遇到了以下问题:
按照编译器的建议向 H 添加协变注释是可行的。如果我不希望 H 是协变的,有没有办法解决这个问题?
scala - 子类型中的压倒性差异
有人可以向我解释为什么示例 1 可以编译但示例 2 没有吗?
示例 1:
示例 2:
示例 2 无法编译并出现以下错误消息:“类型参数 (A) 的种类不符合 trait Foo 中类型参数 (类型 A) 的预期类型。A 的类型参数与类型 A 的预期参数不匹配: type _(在 trait Bar 中)是不变的,但 type _(在 trait Foo 中)被声明为协变的”
scala - HOMap 实现示例
我正在观看Daniel Spiewak 的这个视频,并试图从中实现有关更高种类的示例。这是我得到的:
不幸的是,启动这个我得到类型不匹配错误:
我的问题:
- 我怎样才能解决这个问题?我完全理解我只需要传入正确的类型,但是我在 Scala 中使用这种东西的经验很差,我无法弄清楚这一点。
- 为什么会发生这种情况?我的意思是该操作
tuples: _*
可能被广泛用于传递 toMap
,但它以某种方式给出了一些奇怪的类型 -Main.$anon.HOMap.Pair[K,V]*
而不是它应该给出的。 - 为什么那个例子不再有效?也许最近对 Scala 语言的一些更改改变了一些语法?
感谢您的回答!
scala - Scala 类型检查在模式匹配中对具有更高种类类型参数的案例类意外失败
让我定义一些类型
解决方法的自定义提取器https://issues.scala-lang.org/browse/SI-5900
及其用例
在使用 Scala 2.10.4 编译时,出现以下错误
但Ez[Gen2]
似乎符合Ez[g]
如
我想知道这是否是一个错误。或者,您能否解释原因或某些资源的链接?
scala - 涉及可变数量类型的运行时类型检查/模式匹配
我正在重新审视用于将异构基本类型分组在一起的通用包装器的问题。我正在使用类型成员,所以现在结构如下所示:
那么问题当然是测试特定对象,例如:
由于类型擦除,这不起作用。问题是我必须为对等点抽象类型参数,也就是说,有(大多数)对等点也有一个类型参数[S]
,但其他人没有。Inner
因此,对and/or使用类型构造函数参数Outer
是不可行的。
便宜的解决方案是需要实际的子类:
但我不喜欢这个解决方案,因为我会有很多不同的同伴,而且我不想为每个同伴创建专用的包装类。例如,如果我必须在每个子类中编写复制方法,复制这些对象也会变得很烦人。
所以我可能会留下类标签?如果我有以下两种类型参数不同的对等类型,这将如何解决:
?
scala - 定义类型构造函数来构建类型 lambda(部分应用类型)
我在定义类型构造函数以消除 Scala 中用于部分类型应用程序的可怕的 type-lambda 方法时遇到问题。鉴于:
假设我有这个方法:
我想这样定义它:
问题是:如何定义类型构造函数XXX[A]
?
我的想法是这样的:
但它只会产生
scala - 为更高种类的类型修复类型推断
好的,所以我有这个非常简单的设置:
还有一家工厂:
现在在实践中,f*** Scala 类型推断崩溃了:
所以我的下一个尝试是存在类型:
这给了我以下可爱的信息:
“类型 E1 有一个类型参数,但类型 E1 有一个”——嗯?
问题:如何定义工厂的apply
方法来推断类型?