Scala 将属性添加到类型而不是类型实例的隐式转换
为了更好地理解类型类,我阅读了一些较旧的Scala文章,然后运行了 这看起来很有用,但这个例子似乎已经过时了 有人能帮我找出正确的方法来实现菲利普的意图吗?这是密码Scala 将属性添加到类型而不是类型实例的隐式转换,scala,typeclass,implicit,Scala,Typeclass,Implicit,为了更好地理解类型类,我阅读了一些较旧的Scala文章,然后运行了 这看起来很有用,但这个例子似乎已经过时了 有人能帮我找出正确的方法来实现菲利普的意图吗?这是密码 trait Default[T] { def value : T } implicit object DefaultInt extends Default[Int] { def value = 42 } implicit def listsHaveDefault[T : Default] = new Default[List
trait Default[T] { def value : T }
implicit object DefaultInt extends Default[Int] {
def value = 42
}
implicit def listsHaveDefault[T : Default] = new Default[List[T]] {
def value = implicitly[Default[T]].value :: Nil
}
default[List[List[Int]]]
当复制/粘贴并在REPL中运行时,我得到这个>
scala> default[List[List[Int]]]
<console>:18: error: not found: value default
default[List[List[Int]]]
^
scala>default[List[List[Int]]
:18:错误:未找到:默认值
默认值[列表[列表[Int]]
^
这与Scala版本无关。如果阅读,您会注意到,default
方法没有在任何地方定义。这在任何Scala版本中都不起作用
它应该是这样的:
def default[T: Default] = implicitly[Default[T]].value
感谢Jorg的回答,再加上他的回答,帮助我弄清楚这里到底发生了什么。希望我的补充答案能帮助其他对此感到困惑的人 我对类型类的印象是,它们是图书馆的作者灌输他/她知识的一种方式 具有令人向往的特性的图书馆 另一方面,还有另一种用于特殊多态性的技术:。 当您是具有某种类型的库的消费者时,可以使用后一种技术 这是缺少的方法,你觉得有用 我将尝试扩展Phillipe的例子来说明我对如何 库设计器可以使用类型类。我对Scala没什么经验。。。所以如果 任何人注意到我理解不正确的事情,请纠正我!;^) 给定上述代码,如果我可以为类型List[List[Int]]或Int的
makeMsg[List[List[Int]]]("moocow-")
makeMsg[Int]("dogbox")
我得到了这个结果:
res0: String = moocow-List(List(42))
res1: String = dogbox42
如果要覆盖给定类型的默认隐式值,可以这样做:
makeMsg[Int]("moocow-")(something=new Object with Default[Int] { def value = 33344 } )
我得到了这个结果:
res3: String = moocow-33344
这对我来说似乎是一个很好的解释。您可以添加两件事:1)对于
DefaulInt
,您不一定需要对象,您还可以有一个值和一个匿名类,例如implicit val defInt=new Default[Int]{…}
。重要的是,环境中存在类型为Default[Int]
的东西。2) makeMsg
的签名可以是makeMsg[T:Default]
,这是隐式
参数的语法糖。唯一的区别是,现在,由于您没有arg的名称,您需要隐式地使用[Default[t]]
来检索它。谢谢Philippe,感谢您的评论和您最初的帖子,这激发了我的问题。re:你的最后一点,我现在明白了。但我最初被上下文边界(你提到的语法糖)弄糊涂了。如果阅读本文的其他人对上下文边界感到困惑,您可能会发现这篇文章很有用:
res3: String = moocow-33344