标签: implicit

使用隐式字段实例化类

给这个类一个implicitInt。

scala> class Foo(implicit val x: Int) { 
     |   def getX = x
     | }
defined class Foo
Run Code Online (Sandbox Code Playgroud)

我可以通过以下方式明确创建一个:

scala> val f = new Foo()(1)
f: Foo = Foo@21aba4f3
Run Code Online (Sandbox Code Playgroud)

但我不能:

scala> val f = new Foo(100)
<console>:18: error: too many arguments for constructor Foo: ()(implicit x: Int)Foo
       val f = new Foo(100)
Run Code Online (Sandbox Code Playgroud)

争论是怎么回事()

scala implicit

2
推荐指数
1
解决办法
583
查看次数

无法在 scala 中找到参数的隐式值

    def p1(c: Int)(implicit b: Int): Unit = {
        println(c + b)
    }

    def p2(a: Int, b: Int): Unit ={
        p1(a)
    }

    p2(5, 6) //result = 11
Run Code Online (Sandbox Code Playgroud)

错误:找不到参数 b 的隐式值:Int

如何解决问题但不要使用此解决方案

 def p2(a: Int, b: Int): Unit ={
        implicit val bb = b
        p1(a)
    }
Run Code Online (Sandbox Code Playgroud)

scala implicit

2
推荐指数
1
解决办法
3209
查看次数

Scala 类定义中“隐式 val”的含义是什么?

我正在努力加快 Scala 的速度,但对关键字“ implicit ”的使用有点困惑。

我想我理解隐式参数的概念,其中参数没有显式传入,Scala 将搜索正确类型的值(在调用范围内)。

我对“隐式 val ”的使用感到困惑。

考虑以下代码片段:

case class DemoApp() {
   implicit val foo = CustomerFoo()
}
Run Code Online (Sandbox Code Playgroud)

这与传递到 DemoApp() 类构造函数的参数有关吗?

有人可以澄清一下吗?

谢谢,约翰B

scala implicit

2
推荐指数
1
解决办法
3137
查看次数

创建类型敏感函数而不更改父特征或案例类

假设我有两个类PersonBusiness,它们由特质 扩展Entity

trait Entity
case class Person(name: String) extends Entity
case class Business(id: String) extends Entity
Run Code Online (Sandbox Code Playgroud)

假设我无法更改Entity,Person并且Business(它们位于不同的文件中并且不能更改),我如何定义一个函数,例如 a ,根据实体printEntity打印字段name或?id例如,给定Person和的实例Business,我该如何做这样的事情:

object Main extends App {
  val person1: Person = Person("Aaaa Bbbb")
  val business1: Business = Business("0001")
  
  // How can I do something like this?
  person1.printEntity // would call a function that executes println(id)
  business1.printEntity // would call a function …
Run Code Online (Sandbox Code Playgroud)

extension-methods scala class implicit implicit-class

2
推荐指数
1
解决办法
58
查看次数

Make F[_] implementing Monad trait while accepting IO

Let us say we have the code (<: Monad[F] doesn't work as expected):

class External[F[_] <: Monad[F] : Concurrent](implicit proxy: Proxy[F]) { ... }

class Proxy[F[_] <: Monad[F]](implicit storage: Storage, async: Async[F]) {
  def get(key: String): F[Option[Entry]] = {
    async.blocking(storage.get(key))
  }
}
Run Code Online (Sandbox Code Playgroud)

I would like F[_] to be a Monad, so that proxy.get() have those traits and enables for example (inside External class):

proxy.get(key).flatMap(...)
Run Code Online (Sandbox Code Playgroud)

So far so good, but when trying to instantiate with cats.effect.IO it doesn't work …

scala implicit typeclass scala-cats cats-effect

2
推荐指数
1
解决办法
452
查看次数

如何在 Scala 中将 Option[List[String]] 转换为 List[String]?

我有类似的Option情况, 我需要转换为Scala。我的意思是。ListStringSome(List("abc","def","ghi"))List("abc","def","ghi")Option[List[String]]List[String]

scala implicit sbt playframework

2
推荐指数
1
解决办法
219
查看次数

Scala 中隐式值方法的类型参数 - Circe

我是 Scala 新手,正在使用它circe来建模和序列化一些 API 响应。我发现自己使用以下样板

sealed trait SomeTrait

object SomeTrait {
    implicit val someEncoder: Encoder[SomeTrait] = deriveEncoder[SomeTrait]
    implicit val someDecoder: Decoder[SomeTrait] = deriveDecoder[SomeTrait]

    <code>
}
Run Code Online (Sandbox Code Playgroud)

相反,我想使用泛型,并定义类似的东西

trait SerializableTrait[A] {
    implicit val someEncoder: Encoder[A] = deriveEncoder[A]
    implicit val someDecoder: Decoder[A] = deriveDecoder[A]
}
Run Code Online (Sandbox Code Playgroud)

然后多次使用扩展:

sealed trait SomeTrait

object SomeTrait extends SerializableTrait[SomeTrain] {

    <code>
}
Run Code Online (Sandbox Code Playgroud)

但我得到的could not find Lazy implicit value of type io.circe.generic.encoding.DerivedAsObjectEncoder解码器也是类似的。

我知道我可能正在尝试实现circle.auto功能,但我想了解这种用法​​有什么问题。理想情况下,我希望编译器dervieEncoder/Decoder仅在实际需要时在非类型参数化特征内评估。

generics scala implicit circe

2
推荐指数
1
解决办法
922
查看次数

有没有办法隐含地完成这项工作?

有没有办法在匹配之前调用x上的这个隐式方法来满足匹配的类型要求?

如果我直接调用它,它按预期工作,但我想知道是否可以推断出该调用.

object ImplicitTest extends App {
  implicit def denull[T<:Any](mightBeNull:T):Option[T] = {
    if (mightBeNull == null) None
    else Some(canBeNull)
  }

  var x:String = null
  x match {  //works if i do "denull(x) match {"
    case Some(str:String) =>
      println(str)
    case None => None
  }
}
Run Code Online (Sandbox Code Playgroud)

scala type-inference implicit

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

Scala:隐式类的多个类型参数

我正在尝试将数据类型通用编程的Haskell库的一部分移植到Scala.这是我遇到的问题:

我已经Generic使用一些容器类型参数定义了一个特征:

trait Generic[G[_]] {
     // Some function declarations go here
 }
Run Code Online (Sandbox Code Playgroud)

现在我有一个抽象类,Collect有三个类型参数和一个函数声明(它表示一种类型,而不是可以从类型结构中将所有类型的子类收集B到一个类型的容器中):F[_]A

abstract class Collect[F[_],B,A] {
  def collect_ : A => F[B]
}
Run Code Online (Sandbox Code Playgroud)

为了使其延伸通用,前两个类型参数F[_]B给出,并且A是咖喱(这种效果是使用类型lambda表达式模拟的):

class CollectC[F[_],B] extends Generic[({type C[A] = Collect[F,B,A]})#C] {
    // Function definitions go here
}
Run Code Online (Sandbox Code Playgroud)

问题是我需要最后一个类定义是隐式的,因为稍后在我的代码中我将需要能够编写像

class GUnit[G[_]](implicit gg: Generic[G]) {
    // Some definitions
}
Run Code Online (Sandbox Code Playgroud)

当我只是前面implicit的类定义时,我得到一个错误说implicit classes must accept exactly one primary constructor parameter.有谁遇到过类似的问题?有没有一种已知的解决方法?我目前没有看到如何在保持相同功能的同时重构代码,所以欢迎任何建议.提前致谢!

scala implicit generic-programming

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

Encoders.product中的TypeTag是什么?

我使用Spark 2.1.1.

我从以下开始:

import org.apache.spark.sql.types._
val mySchema = StructType(
  StructField("id", IntegerType, true),
  StructField("code", StringType, false),
  StructField("value", DecimalType, false))
val myDS = Seq((1,"000010", 1.0), (2, "000020", 2.0)).as[mySchema]
Run Code Online (Sandbox Code Playgroud)

在这里,我看到mySchema不是一个类型,看了之后Encoders.scala我可以看到我需要通过这里传递一个Product的子类型

def product[T <: Product : TypeTag]: Encoder[T] = ExpressionEncoder()
Run Code Online (Sandbox Code Playgroud)

因此,在看到冒号操作符只是来自什么是Scala上下文和视图边界的隐式参数的语法糖之后,我可以看到应该有一个隐含的TypeTag [T]可用,但我不明白TypeTag [T]是如何隐含的SQLImplicits.scala.

   /**
   * @since 1.6.1
   * @deprecated use [[newSequenceEncoder]]
   */
  def newProductSeqEncoder[A <: Product : TypeTag]: Encoder[Seq[A]] = ExpressionEncoder() 
Run Code Online (Sandbox Code Playgroud)

即使它被弃用了,当我看到它时

 /** @since 2.2.0 */
  implicit def newSequenceEncoder[T <: Seq[_] : …
Run Code Online (Sandbox Code Playgroud)

scala implicit apache-spark apache-spark-sql

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