标签: implicits

为什么Scala隐式解析对于带有类型参数的重载方法失败?

第一个示例成功找到了对方法的隐式转换foo(String),但是只要我添加一个类型参数(请参阅fails参考资料),编译就不再解析它了:

object works {
  class A {
    def foo(): String = ???
  }
  implicit class PimpedA(a: A) {
    def foo(i: String): String = ???
  }
  val a = new A()
  a.foo("test") //compiles
}

object fails { //same as `works`, but adds type parameter
  class A {
    def foo[T](): String = ???
  }
  implicit class PimpedA(a: A) {
    def foo[T](i: String): String = ???
  }
  val a = new A()
  PimpedA(a).foo("test") // compiles
  a.foo("test") // error: too …
Run Code Online (Sandbox Code Playgroud)

scala type-conversion implicits

7
推荐指数
1
解决办法
692
查看次数

Scala隐含伴随对象中的Numeric [T]

我有以下通用的Interval类(由用户soc为我制定):

case class Interval[T](from: T, to: T)(implicit num: Numeric[T]) {
  import num.mkNumericOps // allows us to write from.toDouble and to.toDouble
  def mid: Double = (from.toDouble + to.toDouble) / 2.0
}
Run Code Online (Sandbox Code Playgroud)

典型用例:Interval [Double]或Interval [Int].为了添加二元联合交集运算符,我(implicit num: Numeric[T])在伴随对象中遵循了类似的模式:

object Interval {

  def union[T](interval1: Interval[T], interval2: Interval[T])(implicit num: Numeric[T]) = {
    import num.mkOrderingOps // allows interval1.from min
    Interval[T](interval1.from min interval2.from, interval1.to max interval2.to)
  }

  def intersect[T](interval1: Interval[T], interval2: Interval[T])(implicit num: Numeric[T]) = {
    import num.mkOrderingOps
    Interval[T](interval1.from max interval2.from, …
Run Code Online (Sandbox Code Playgroud)

scala numeric implicit implicit-conversion implicits

6
推荐指数
2
解决办法
1026
查看次数

如何在Scala中表达这种类型?存在类型类(即隐式)限制?

我正在使用Play框架的JSON库,它使用类型类来实现该Json.toJson功能.(我可能决定使用另一种静态类型较少的技术,比如反射;但是现在我想使用这个库,因为它帮助我学习了Scala类型系统.)

我有一些需要传递给它的简单case类toJson,所以我必须为Writes[T]它们中的每一个实现一个隐式对象.对于每个类,第一个剪切可能看起来像这样.

// An example class
case class Foo(title: String, lines: List[String])

// Make 'Foo' a member of the 'Writes' typeclass
implicit object FooWrites extends Writes[Foo] {
  def writes(f: Foo) : JsValue = {
    val fields = Seq("title" -> toJson(f.title), 
                     "lines" -> toJson(f.lines))                        
    JsObject(fields)
  }
}  
Run Code Online (Sandbox Code Playgroud)

每个类都有一个类似的隐含值,所以我可以抽象出公共部分,如下所示.但是这不会编译,因为我不确定如何声明类型.

def makeSimpleWrites[C](fields: (String, C => T??)*) : Writes[C] = {
  new Writes[C] {
    def writes(c: C) : JsValue = {
      val jsFields = fields map { …
Run Code Online (Sandbox Code Playgroud)

scala existential-type implicits

6
推荐指数
1
解决办法
663
查看次数

为什么不适用的隐式转换会引入歧义?

此示例的设置(Scala 2.10.3):

trait S[A]
trait T[A]
implicit class X[A : S](a: A) { def foo() { } }
implicit class Y[A : T](a: A) { def foo() { } }
implicit object I extends S[String]
Run Code Online (Sandbox Code Playgroud)

这编译:

new X("").foo()
Run Code Online (Sandbox Code Playgroud)

这不是:

new Y("").foo()
Run Code Online (Sandbox Code Playgroud)

因为没有隐含的T[String].

could not find implicit value for evidence parameter of type T[String]
              new Y("").foo()
              ^
Run Code Online (Sandbox Code Playgroud)

因此,我认为scalac可以毫不含糊地将隐式转换String应用于X:

"".foo()
Run Code Online (Sandbox Code Playgroud)

但相反,我们得到:

type mismatch;
 found   : String("")
 required: ?{def foo: ?}
Note that implicit conversions are not …
Run Code Online (Sandbox Code Playgroud)

scala implicits

6
推荐指数
1
解决办法
364
查看次数

关于Scala中类型类的问题

让有课Fruit,OrangeApple.

abstract class Fruit
class Orange extends Fruit
class Apple extends Fruit
Run Code Online (Sandbox Code Playgroud)

现在,我想添加write的功能这两种类型OrangeApple.使用类型类模式我可以执行以下操作:

trait Writer[T] {def write(t:T)}

implicit object AppleWriter extends Writer[Apple] {
   def write(a:Apple) {println("I am an apple!")} 
}

implicit object OrangeWriter extends Writer[Orange] {
   def write(o:Orange) {println("I am an orange!")} 
}

def write[T](t:T)(implicit w:Writer[T]){w.write(t)}
Run Code Online (Sandbox Code Playgroud)

所以,好,但如果我想定义writeFruits怎么办?

def writeFruits(fruits:List[Fruit]) {for (fruit <- fruits) write(fruit)}
Run Code Online (Sandbox Code Playgroud)

我想writeFruits给每一个write[Apple]write[Orange]每个人打电话fruit.我发现它不起作用(我知道为什么)但也许 …

scala typeclass implicits

5
推荐指数
2
解决办法
285
查看次数

Scala集合中的森林砍伐

从Scala集合的设计中我理解如下:

scala> BitSet(1,2,3) map (_ + "a")
res7: scala.collection.immutable.Set[String] = Set(1a, 2a, 3a)
Run Code Online (Sandbox Code Playgroud)

不构建中间数据结构:新的Set是在使用Builder迭代BitSet时构建的.事实上,在这种情况下很明显,因为字符串的位组没有意义.

列表中的地图怎么样?我很确定以下内容构建了一个中间列表:

scala> List(1,2,3) map (_ -> "foo") toMap
res8: scala.collection.immutable.Map[Int,java.lang.String] =
    Map(1 -> foo, 2 -> foo, 3 -> foo)
Run Code Online (Sandbox Code Playgroud)

即清单List((1,foo), (2,foo), (3,foo)).如果没有,那怎么样?现在,以下怎么样?

scala> Map.empty ++ (List(1,2,3) map (_ -> "foo"))
res10: scala.collection.immutable.Map[Int,java.lang.String] =
    Map(1 -> foo, 2 -> foo, 3 -> foo)
Run Code Online (Sandbox Code Playgroud)

这一次,从我似乎从以下类型的理解++:

def ++ [B >: (A, B), That]
       (that: TraversableOnce[B])
       (implicit bf: CanBuildFrom[Map[A, B], B, That]): That
Run Code Online (Sandbox Code Playgroud)

认为 …

collections scala implicits

5
推荐指数
1
解决办法
429
查看次数

为什么我们必须显式导入具有来自伴随对象的隐式参数的隐式转换?奇怪.

我们考虑一下这段代码:

class A
object A{
  implicit def A2Int(implicit a:A)=1
  implicit def A2String(a:A)="Hello"
}

object Run extends App{
  implicit val a: A =new A

  import A.A2Int
  // without this import this code does not compile, why ?
  // why is no import needed for A2String then ?

  def iWantInt(implicit i:Int)=println(i)
  def iWantString(implicit s:String)=println(s)

  iWantInt
  iWantString(a)
}
Run Code Online (Sandbox Code Playgroud)

它运行和打印:

1
Hello
Run Code Online (Sandbox Code Playgroud)

现在,如果我们注释掉这条线

import A.A2Int
Run Code Online (Sandbox Code Playgroud)

然后我们得到一个编译错误:

在此输入图像描述

随着该系列的注释,为什么Scala无法找到A.A2String它是否能找到A.A2Int

如何解决这个问题?

谢谢阅读.

scala implicit-conversion implicits companion-object

5
推荐指数
1
解决办法
3363
查看次数

scala编译器是否做了任何优化隐式类的操作?

假设我们有一个隐含的类,如:

implicit class RichString(str: String) {
  def sayHello(): String = s"Hello, ${str}!"
}
Run Code Online (Sandbox Code Playgroud)

我们可以使用sayHello方法,就好像它是在String类中定义的一样

"World".sayHello
Run Code Online (Sandbox Code Playgroud)

scala编译器是否将其优化为静态调用以避免构造RichString对象的开销?

scala implicits

5
推荐指数
1
解决办法
188
查看次数

如何在Scala中链接泛型含义?

这个帖子,讨论implicits的链接,但我认为它不包括我的情况,因为我有通用implicits.演示此问题的示例项目位于此处.要重现两条线应该被注释掉.

所以我对具体类型有许多含义,例如

implicit val ObjectIdColumnType: ColumnType[ObjectId] = MappedColumnType.base[ObjectId, Array[Byte]](
      { obj => obj.toByteArray }, { arr => new ObjectId(arr) }
    )
Run Code Online (Sandbox Code Playgroud)

我希望所有这些都能自动生成GetResult[T]隐式val.因此我写了以下功能

implicit def getResultForTypedTypes[T](implicit bct: ColumnType[T]): GetResult[T] =
  GetResult[T](r => bct.getValue(r.rs, r.currentPos))
Run Code Online (Sandbox Code Playgroud)

我希望这个功能与原型如

def << [T](implicit f: GetResult[T]): T = f(this)
Run Code Online (Sandbox Code Playgroud)

能够接受 GetResult[ObjectId]

可悲的是我得到了错误

Error:(78, 20) could not find implicit value for parameter f: slick.jdbc.GetResult[org.bson.types.ObjectId]
      val id = r.<<[ObjectId]
                   ^
Run Code Online (Sandbox Code Playgroud)

我启用了log-implicits,发现看似无关的隐式隐藏在某种程度上

Information:(78, 20) getResultForTypedTypes is not a valid implicit value for …
Run Code Online (Sandbox Code Playgroud)

scala implicit-conversion implicits slick slick-3.0

5
推荐指数
0
解决办法
180
查看次数

在任何地方导入Spark隐式方法

我是Spark 2.0的新手,并在我们的代码库中使用数据集。我注意到我需要import spark.implicits._在代码中的任何地方。例如:

File A
class A {
    def job(spark: SparkSession) = {
        import spark.implcits._
        //create dataset ds
        val b = new B(spark)
        b.doSomething(ds)
        doSomething(ds)
    }
    private def doSomething(ds: Dataset[Foo], spark: SparkSession) = {
        import spark.implicits._
        ds.map(e => 1)            
    }
}

File B
class B(spark: SparkSession) {
    def doSomething(ds: Dataset[Foo]) = {
        import spark.implicits._
        ds.map(e => "SomeString")
    }
}
Run Code Online (Sandbox Code Playgroud)

我想问的是,是否有一种更清洁的方法

ds.map(e => "SomeString")
Run Code Online (Sandbox Code Playgroud)

没有在我做地图的每个函数中导​​入隐式函数?如果不导入,则会出现以下错误:

错误:(53,13)无法找到数据集中存储的类型的编码器。导入spark.implicits。支持基本类型(Int,String等)和产品类型(案例类)。_在将来的版本中将添加对其他类型进行序列化的支持。

scala implicits apache-spark spark-dataframe apache-spark-2.0

5
推荐指数
1
解决办法
1081
查看次数