【发布时间】:2021-07-27 04:55:06
【问题描述】:
我想编写一个函数showAll,它接受一个List 的值并生成一个String,该String 是通过连接每个值的String 表示获得的,使用隐式范围内可用的Show 实例.
除了Show 实例的存在之外,列表元素的类型应该没有限制。
例如:
case class Person(name: String)
implicit val showPerson: Show[Person] = Show.by(_.name)
showAll(List(1, Person("Martin")))
应该输出:
1 Martin
在这种情况下,函数使用 Show[Int] 和 Show[Person] 实例。
函数的正确签名是什么?
谢谢。
【问题讨论】:
-
问题是 List 的类型是
List[Any],没有Show没有简单的方法来拥有每个元素的Show。有很多技巧可以得到你想要的,从 magnet 模式,到创建一个自定义类,用它的 show 实例压缩每个元素,再到使用 Shapeless 来做自动压缩。 -
确实,这就是问题所在。我的第一个想法是添加一些常见的超类型 T,然后为 T 编写一个显示实例,但我想知道是否可以通过某种方式增强签名来解决它。无形看起来很有趣。
-
检查this (search for the section called "Bonus Round: How do we deal with collections?") - 如果你设法让它工作,请发布答案! :)
-
你坚持
List还是可变参数也适合你?喜欢showAll(1, person)?
标签: scala functional-programming scala-cats