当我使用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]
。
答案 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还有一些很好的指南: