Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 将属性添加到类型而不是类型实例的隐式转换_Scala_Typeclass_Implicit - Fatal编程技术网

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

为了更好地理解类型类,我阅读了一些较旧的Scala文章,然后运行了 这看起来很有用,但这个例子似乎已经过时了

有人能帮我找出正确的方法来实现菲利普的意图吗?这是密码

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