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

scala - Scala:更高种类的类型、类型投影和类型不匹配错误

我有以下代码:

我可以通过两种方式实例化 TransM 类型的变量:

我认为 ListM#T 是冗余类型参数,所以我试图消除它:

将变量实例化为

不幸的是,由于类型不匹配错误,无法编译第二个实现:

我可以解决这个问题并简化我的代码,还是应该到处写样板 ListM#T?

0 投票
1 回答
1247 浏览

ocaml - OCaml 中的高阶类型(幻像类型子类型)

我正在使用幻像类型来模拟堆栈的状态,作为 ocaml-lua 的包装器模块(Lua 通过堆栈与 C/OCaml 通信)。小代码示例:

某些堆栈操作在表和数组表上都是可能的(Lua 中没有真正的数组);有些不是。所以如果我有类型

我想要一种类似 table-or-array 的函数,用于在这两种类型上运行的函数,但仍然能够rawgeti在表上禁止例如(数组操作)。objlen是一个堆栈操作,它返回堆栈顶部元素的“长度”。该元素可以是表或数组表。目前,包装函数定义如下:

我想要的是

也就是说,array并且table是 的子类型table-or-array

有任何想法吗?

问候 Olle

编辑

经过考虑,我想出了这个:

类型级别的堆栈现在应该知道的不比堆栈本身多或少。例如,rawgeti 将推送任何类型的堆栈。

0 投票
1 回答
85 浏览

scala - Scala 会消除这里重复的需要吗?

只是在看这个问题:删除 Interface 中的冗余类型。事实证明不可能消除TC# 中的类型参数。这与更高种类的类型有关吗?Scala 能解决这个问题吗?

0 投票
1 回答
829 浏览

haskell - kind 类型 (* -> *) -> * 的函子和应用程序

我遇到了这样一种情况,我的代码可以从使用FunctorApplicative类似的抽象中受益,但是对于 kind 类型(* -> *) -> *。可以RankNTypes像这样定义更高种类的函子

但更高版本的Applicative有点棘手。这是我能想到的最好的:

我们需要:->wrapper 类型才能使用 kind 函数,* -> *但这并不能让我们像普通 Applicatives 那样很好地链接函数应用程序。我可以使用助手进行管理,例如<$><*>

但是最好有一种通用的方法来“提升”任何数量的功能。

如何使用上述实例的一些简单示例:

所以,我的问题是:上面提到的类型类是什么,它们是否已经由 hackage 中的某个库提供?通过谷歌搜索,我想出了Functor2inlinear-mapsHFunctorin ,multi-rec但也不是我需要的。

另外,是否有某种方法可以在HApplicative没有:->包装器的情况下进行编写,或者是否有其他方法可以使功能提升更容易?

0 投票
2 回答
270 浏览

scala - 使用更高种类的通用约束地图?

我正在尝试实现一个结果缓存(Loader类),它将类的可散列实例映射Resolver[T]Result实例,其中Tis 的类型为Result. 当然,用户可以专门化Result提供特定于应用程序的额外方法的类。关键是使用该Loader.get方法用户还必须指定结果类型:

我想要的是避免强制转换并使其隐式,所以代码应该是这样的:

我目前拥有的代码如下:

由于我对 scala 语言比较陌生,我的问题是:是否有可能通过使用 scala 提供的高级类型功能来实现这种隐式转换?我看了一下演讲“Scala Land of the Land of High Wizardry”,演讲者 Daniel Spiewak 介绍了一个执行类似操作的高阶HOMap,但我仍然不太了解如何使他的解决方案适应我的情况。

0 投票
1 回答
833 浏览

scala - Scala 高级类型:无法定义适用于不同集合的泛型函数

我正在使用 Scala 2.10.2。

我需要一个函数

哪里M可以是 Seq、List、Map 或其他任何东西,并且返回类型仍然是合适的。

我正在使用以下测试:

我目前的尝试如下:

尝试#1

这失败了:

尝试#2

这个仅限于映射,可变或不可变。

这失败了:

工作非通用解决方案

但这根本不是通用的:|

任何人都可以阐明如何正确编写这个吗?

0 投票
1 回答
187 浏览

scala - 多态类型的类型类遭受类型擦除

给定一个多态类型Distribution,我想在这个(多态)类型上建立我称之为类型类的东西。我认为这属于 Higer Kinded Types 一词。

实例化这个类型类的分布应该实现一个方法 train,它给定分布域中的元素列表,返回一个对象这个分布。

但是当我尝试像这样实例化时(Binomial is a Distribution[Int]):

我收到以下错误:

我猜我是类型擦除的受害者,但我不确定,只是在学习与 scala 类型系统作斗争。有人能够修复此代码还是我被迫使用不同的设计?

先感谢您。

0 投票
1 回答
1590 浏览

c# - C# 中的 Monad 转换器

我正在使用 C# 中的 monad 转换器。
我想知道我提供的以下代码是否表明我已经理解了这一点。
我对此相当陌生,因此非常欢迎任何反馈/评论。
此示例仅用于将可能的 monad 包装在验证 monad 中。

另一个较小的子问题是,如果 C# 具有更高种类的类型,我可以只实现这个类一次(ValidationT)并且它适用于所有其他包装的 monad,还是这是不正确的?

0 投票
3 回答
2363 浏览

scala - Scala:返回类型 Seq[A] 或 Future[Seq[A]] 的泛型

问题

我有两个类,如下所示:

这两个类之间的唯一区别是 Now 返回一个 Seq,Later 返回一个 Future Seq。我希望这两个类共享相同的接口

我试过的

考虑到 Seq 和 Future[Seq] 应该只需要一个类型参数,这似乎非常适合更高种类的类型。

我是否错误地使用了更高种类的类型?我是否错误地提供了 Future[Seq]?有没有办法让现在和以后共享同一个界面?

0 投票
1 回答
449 浏览

scala - scala中扁平元组的高阶操作

我最近遇到一个问题。我正在尝试以编译器友好的方式展平“尾部嵌套”元组,并且我提出了以下代码:

上面的代码适用于展平我称之为“tail-nested”的元组,如下所示。

但是,我力求使我的解决方案更加健壮。考虑一个例子,我有一个这些更高种类的“尾嵌套”元组的列表。

this 的推断类型签名将是,这会给List[(Int, Any)]诸如 之类的操作带来问题,该操作map将失败并显示:

error: No implicit view available from Any => List[Int]

这个错误对我来说是有意义的,因为我在 flatten 函数中的递归隐式链的性质。但是,我想知道:有什么方法可以使我的扁平化元组的方法更加健壮,以便高阶函数(例如,map与它很好地啮合)?

编辑:

正如 Bask.ws 所指出的, Product trait 提供了一个很好的解决方案的潜力。下面的代码说明了这一点:

这个新的 flatten 调用的结果类型始终是 List[Any]。如果有办法让编译器稍微收紧这个界限,我的问题就会得到解决。与我最初的问题平行,有谁知道是否有可能做到这一点?