问题标签 [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 回答
372 浏览

haskell - 提升类型的模式匹配

我们可以为 kind 参数编写单一的、综合的实例*

这编译得很好,请注意我们不需要对 test1 的 (MyClass (Maybe d)) 约束,因为编译器会找到任何匹配的实例Maybe d

我们甚至可以为类型构造函数的类参数编写一个包罗万象的实例:

这也编译得很好,并且 test2 不需要 (MyClass2 Maybe) 约束,因为编译器会找到匹配的实例。

考虑以下玩具代码来计算(提升)类型列表的长度:

这会导致错误:

如果我们注释掉 的签名test4,GHCi 将类型推断为

但这不应该是必要的。显然,我已经为它编写了ListLen匹配任何可能的类型列表的实例:一个“空列表”案例和一个“缺点”案例。如果我将ListLen参数的种类更改为有种类[*](即删除HList包装器ListLen及其实例),问题仍然存在。

如果我们注释掉test4test3编译并运行良好:因为我(本质上)为我如何构造类型列表提供了明确的语法('[Int,Double,Integer]),编译器能够找到匹配的实例。

我正在尝试编写为我构建类型列表的代码,因此我不必写出显式类型列表语法。然而,使用显式语法似乎是 GHC 能够匹配这些综合实例的唯一方法。也许我错过了一个案例?我没有使用的语法?

我能做些什么来让 GHC 意识到我有一个适用于所有类型的实例[*] 我正在使用 GHC 7.4.2。这可能之前关于解构非提升类型的帖子有关。关于类型提升的论文可以在这里找到。

0 投票
2 回答
516 浏览

scala - 如何为泛型类型编写 scalaz.IsEmpty 参数

我正在尝试编写一个通用方法,它将任何具有scalaz.IsEmptytypeclass 实例的内容包装到Option. 它应该返回空值,如果它是非空的,则将其None包装进去。Some这是我到目前为止提出的:

asOption0适用于原始类型,例如String(通过使用类型 lambda来指示C具有 shape B[_])并asOption1适用于具有一元类型构造函数的类型,例如List

是否可以同时编写一种适用于StringList和 更高类型的方法?

0 投票
2 回答
2897 浏览

scala - 更高种类的类型——为什么可能是 Scala 而不是 F#?

鉴于 CLR 泛型实现支持比 JVM 更多的功能,例如具体化,而 JVM 的泛型只是 Java “编译器技巧”,为什么高级类型在 F# 中不可能,但在 Scala 中可能?CLR 泛型实现是否会以某种方式妨碍事情,而 JVM 的缺乏使您可以比设计者的意图走得更远;有点像动态语言让你做强类型编译器不可能做到的技巧?

0 投票
1 回答
2062 浏览

ocaml - OCaml:更高种类的多态性(对模块进行抽象?)

假设我有一个选项列表:

我想将这些转换为列表选项,例如:

  • 如果列表包含None,则结果为None
  • 否则,将收集各种整数。

对于这种特定情况(使用CoreMonad模块)编写这个相对简单:

但是,正如问题标题所暗示的那样,我真的很想对类型构造函数进行抽象,而不是专门针对Option. 核心似乎使用函子来提供更高种类的类型的效果,但我不清楚如何编写要在模块上抽象的函数。在 Scala 中,我会使用一个隐含的上下文来要求某些Monad[M[_]]. 我期望没有办法隐式传递模块,但我将如何明确地做到这一点?换句话说,我可以写一些近似于这个的东西:

这是可以用一流的模块完成的吗?

编辑:好的,所以我实际上并没有尝试使用该特定代码,而且它似乎比我预期的更接近工作!似乎语法实际上是有效的,但我得到了这个结果:

错误的第一部分似乎令人困惑,因为它们匹配,所以我猜问题出在第二部分 - 这里的问题是返回类型似乎没有确定吗?我想它取决于传入的模块 - 这是一个问题吗?有没有办法修复这个实现?

0 投票
1 回答
116 浏览

scala - 扩展用户定义的高级类型

我在 scala 中有一个更高种类的用户定义别名:

我也有这种类型的值:

要编写可读的代码,我想定义(例如)一个方法,如

它将 FutureOfLastError 的实例映射到 Future[String] 并将其称为

我怎样才能做到这一点?甚至可能吗?我已经尝试过封装在一个案例类中,我想到了各种隐式转换。

我最喜欢的选择是类型别名上的伴生对象,但我无法让它工作,因为我无法从伴生对象调用特征 Future 的方法(如 map 等)。

0 投票
2 回答
2302 浏览

scala - Scala 中高级类型推理的限制是什么?

在以下简化的示例代码中:

我可以在 applicativeOne 上调用 applicativeTwice,并且类型推断有效,只要我尝试在 applicativeTwice(applicativeOne) 上调用它,推断就会失败:

scala 2.10.0 中的错误是

为什么“?F”不能与任何(正确的)匹配?最终,我希望 applicativeTwice 成为一个隐式函数,但我必须首先让类型推断起作用。我见过类似的问题,答案指出了类型推断算法的局限性。但是这种情况似乎非常有限,并且在 monad 转换器中一定很烦人,所以我怀疑我错过了一些解决这个问题的技巧。

0 投票
1 回答
561 浏览

scala - 查看更高级类型的边界

我正在尝试设置一个绑定到高类型类型的视图,但我收到一条我无法理解的错误消息。

不应该bar编译成与foo? 我错过了什么?

0 投票
0 回答
220 浏览

scala - 使用复合有界泛型类型扩展 scala 集合

我对 Scala 比较陌生,我觉得我已经跳入了 Scala 的深处。我需要编写一组(错误,扩展)集合(一个类似于 ArrayBuffer,一个类似于 Array),它们适用于通用(但有界)类型。我对如何解决这个问题有一个想法,但我的整个方法也完全有可能是错误的。

我正在尝试做的事情的本质应该从下面的代码中清楚。我希望能够制作一个“复合对象”的集合,每个组件对象都以某种类型为界。在下面的代码中,Meal对象可以是Meal[Beef, Broccoli]但不能是Meal[Carrots, Broccoli]。然后,我想为复合对象创建两个集合类(Buffer-like 和 IndexedSeq-like)。作为参考,我一直在使用The Architecture of Scala Collections

这段代码无法编译,正如我所指出的,我在伴生对象中尤其遇到了麻烦,特别是在单例对象中实现泛型方面。

正如我所说,我对我所提出的最终不是我最终想要完成的目标的正确解决方案持开放态度。我应该以某种方式使用特征而不是抽象类吗?隐式转换而不是有界泛型和多态?有没有办法强制执行我正在尝试使用组合而不是继承组合Meals对象?这在某种程度上是使用更高种类的类型的地方吗?Scala 有很多 Java 没有的东西,我有点头晕。

更新

澄清一下,我需要做的范围如下:我需要两个集合,一个类 Array 和一个类 ArrayBuffer。集合包含一个由一对子实体组成的实体,每个子实体都有特定的限制。在此处的示例中,集合是针对仅由一种蛋白质和一种蔬菜组成的膳食。这些集合最终将需要使用专门的行为和方法进行扩展,还需要能够覆盖方法的特定实现,以使它们对特定用例更有效。这就是任务的范围。我只是在寻找最简单的方法来完成它。

0 投票
1 回答
1426 浏览

scala - “消极地”使用上下文边界来确保类型类实例不在范围内

tl;博士:我该如何做类似下面的代码:

' Not[Functor]',是这里的组成部分。
我希望它在提供的“m”不是 Functor 时成功,否则编译器会失败。

已解决:跳过问题的其余部分,直接进入下面的答案。


粗略地说,我要完成的是“负面证据”。

伪代码看起来像这样:

请记住,这fixedSizeOf()在相关时更可取,因为它为我们节省了遍历集合的时间。

这样,对于仅Length定义(但未定义Foldable)的容器类型,以及定义了 a 的元素FixedSizeOf,我们可以提高性能。

对于其余的情况,我们会检查集合并汇总各个大小。

我的问题是在为容器定义和Length为元素定义的情况下。这是一个非常常见的情况(例如:已经定义了两者)。FoldableFixedSizeOfList[Int]

例子:

我想要的是Foldable只有在Length+FixedSizeOf组合不适用时才能依赖类型类。

为此,我可以更改foldSizeOf()接受VarSizeOf元素的定义:

现在我们必须填写有问题的部分,即Foldable包含FixedSizeOf元素且未Length定义的容器。我不知道如何解决这个问题,但伪代码看起来像:

' Not[Length]' 显然是这里的组成部分。

我知道的部分解决方案

1)为低优先级隐式定义一个类并扩展它,如' object Predef extends LowPriorityImplicits'所示。最后一个隐式 ( foldSizeOfFixed()) 可以在父类中定义,并将被后代类的替代覆盖。

我对这个选项不感兴趣,因为我希望最终能够支持递归使用SizeOf,这将防止低优先级基类中的隐含依赖于子类中的那些(我的理解是否正确?编辑: 错误!隐式查找从子类的上下文中工作,这是一个可行的解决方案!)

2)一种更粗略的方法是依赖于Option[TypeClass](例如:Option[Length[List]]。其中一些,我可以只写一个大的隐式,选择FoldableSizeOf作为强制性和LengthFixedSizeOf作为可选,如果它们可用,则依赖于后者。(来源:在这里

这里的两个问题是缺乏模块化和在找不到相关类型类实例时回退到运行时异常(这个例子可能可以与这个解决方案一起工作,但这并不总是可能的)

编辑:这是我能够通过可选隐式获得的最好的。它还没有:

除了这与fixedSizeOf()之前的冲突,这仍然是必要的。

感谢您的任何帮助或观点:-)

0 投票
1 回答
634 浏览

scala - Scala:作为类型参数的高级类型

请考虑以下代码片段(它演示了我实际问题的简化版本):

在那里,我有 Id trait 定义了一个将值包装到类型中的函数,而 IdTransformer trait 定义了一种向 id 操作添加新逻辑的方法。我想以类似的方式使用它们

但是当我编译代码时,我收到错误消息

在 composeWith 方法中,虽然 Result[Other] 应该是更高种类的类型并且应该采用单个类型参数。

请解释错误的原因是什么以及是否有解决方法。