繁体   English   中英

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

[英]global, default implicits in 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]

仅当您静态知道类型时, 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提供了一些很好的指南:

好scalaz介绍

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM