1

当我使用 Scalaz 进行编码时,我经常遇到问题,即范围没有隐含。我认为在庞大的 scalaz 包中应该有一些默认的隐含,但要么我不知道在哪里,要么没有。

假设我们想要show任何Anyscalaz (我使用的是 scalaz 7):

scala>     import scalaz._
import scalaz._

scala>     import Scalaz._
import Scalaz._

scala>     {def a: Any = "sratatata"; a}.show
<console>:14: error: could not find implicit value for parameter F0: scalaz.Show[Any]
{def a: Any = "sratatata"; a}.show
^

这是行不通的,因为Show[Any]范围没有隐含。

为什么Scalaz不提供它?使用一些 global 的好方法是Show[A]什么?我的意思是这样的:

scala> implicit def anyShow[A] = Show.showFromToString[A]
anyShow: [A]=> scalaz.Show[A]

scala> {def a: Any = "sratatata"; a}.show
res0: scalaz.Cord = sratatata

我觉得倒是一样Equal

编辑

我已经尝试过添加答案中提到的方法,import scalaz.syntax.ShowSyntax但这并不能解决我的问题。看:

scala>     import scalaz._
import scalaz._

scala>     import Scalaz._
import Scalaz._

scala>     import scalaz.syntax._
import scalaz.syntax._

scala>     import scalaz.syntax.ToShowOps
import scalaz.syntax.ToShowOps

scala>     import scalaz.syntax.ShowSyntax
import scalaz.syntax.ShowSyntax

scala>     {def a: Any = "sratatata"; a}.show
<console>:19: error: could not find implicit value for parameter F0: scalaz.Show[Any]
{def a: Any = "sratatata"; a}.show

编译器还想要一些implicit scalaz.Show[Any].

4

1 回答 1

7

Show仅当您静态知道类型时才有用;如果你只知道你有一个Any,就打电话a.toString.

如果需要Show[String],请导入scalaz.std.string._;因为Show[List[String]]您需要同时导入 scalaz.std.list._scalaz.std.string._

或者,您可以使用scalaz.std.AllInstances._.

这在@eed3si9n 的优秀学习Scalaz系列中逐步解释。

Scalaz 这里也有一些很好的指南:

好的scalaz介绍

于 2012-11-18T21:58:35.823 回答