【问题标题】:global, default implicits in scalaz (scalaz7)scalaz(scalaz7)中的全局默认隐式
【发布时间】:2014-03-30 18:24:41
【问题描述】:

当我使用 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]

【问题讨论】:

    标签: scala scalaz scalaz7


    【解决方案1】:

    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

    【讨论】:

      猜你喜欢
      • 2022-01-11
      • 2014-09-26
      • 2012-02-27
      • 2018-09-08
      • 2011-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-11
      相关资源
      最近更新 更多