在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)