相关疑难解决方法(0)

在Scala中实现产品类型,并在其部件上使用通用更新功能

在Scala中,我需要创建一个&表示复合值的产品类型,例如:

val and: String & Int & User & ... = ???
Run Code Online (Sandbox Code Playgroud)

and应该有一个String零件,Int零件和User零件.这类似于Scala with关键字:

val and: String with Int with User with ... = ???
Run Code Online (Sandbox Code Playgroud)

拥有这样的产品类型我需要一种方法,有一个功能A => A,将它应用于某些产品价值,并通过A部分改变来恢复该产品.这意味着产品中的每种类型都必须是唯一的 - 这是可以接受的.

一个重要的限制是,当将一个功能A => A应用于产品时,我只知道产品在A某个内部,但没有关于它所包含的其他类型的信息.但作为函数的调用者,我将其传递给具有完整类型信息的产品,并希望将此完整类型作为函数签名的一部分返回.

在伪代码中:

def update[A, Rest](product: A & Rest, f: A => A): A & Rest
Run Code Online (Sandbox Code Playgroud)

使用Shapeless或其他深奥的东西对我来说没问题.我尝试使用HLists但它们是有序的,而像异构集这样的东西在这里更适合代表A & Rest部分.

更新:

以下代码解决了我从RégisJean-Gilles回答的用例,下面添加了阅读支持,一些评论和改进的类型安全:

object product …
Run Code Online (Sandbox Code Playgroud)

scala typeclass

5
推荐指数
1
解决办法
373
查看次数

标签 统计

scala ×1

typeclass ×1