scalaz中的全局,默认隐含(scalaz7)

时间:2012-11-18 19:54:01

标签: scala scalaz scalaz7

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

假设我们想在scalaz中show任意Any(我使用的是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不提供它?是使用某些全球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]

1 个答案:

答案 0 :(得分:7)

Show仅在您静态了解类型时才有用;如果您只知道自己有Any,请致电a.toString.

如果您需要Show[String],请导入scalaz.std.string._;对于Show[List[String]],您需要导入 scalaz.std.list._scalaz.std.string._

或者,您可以使用scalaz.std.AllInstances._导入标准库的所有提供的类型类实例。

在@ eed3si9n出色的Learning Scalaz系列节目中逐步解释了这一点。

Scalaz还有一些很好的指南:

Good scalaz introduction