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

paw*_*icz 1 scala scalaz scalaz7

当我使用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
^
Run Code Online (Sandbox Code Playgroud)

这是行不通的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
Run Code Online (Sandbox Code Playgroud)

我觉得同样的感觉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
Run Code Online (Sandbox Code Playgroud)

编译器仍然需要一些implicit scalaz.Show[Any].

ret*_*nym 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还有一些很好的指南:

好斯卡拉斯介绍