我有点困惑的东西理解type的scala手段.
在文档中,我读到的List[Int]是一个类型,List是一个类型构造函数.
type但当我写下以下内容时,关键字是什么意思?
val ls: scala.collection.immutable.List.type = scala.collection.immutable.List
Run Code Online (Sandbox Code Playgroud)
例如,与此type相关的type内容可以定义为特征中的字段.
我试图Monoid从类别理论的角度理解什么,但是我与用来描述它的符号有些混淆。这是维基百科:
在范畴论中,在一个单曲面范畴(C,α,I)中的一个单曲面(或单曲面对象)(M,?,I)是一个具有两个同态的对象M
?:M?M?M称为乘法
?: 一世 ?M称为单位
我对态素表示法感到困惑。为什么二进制运算?是射态符号的一部分?我对态射的理解是,它是一种可以从一种类型映射到另一种类型(域到共域)的函数,例如M ? M。为什么操作?是定义中域的一部分?第二个困惑是关于I。为什么是I域名?根本没有I对象Monoid。它只是对象的中性元素M。
我知道这Monoid是一个具有一个对象,同一性同态和在该对象上定义的二进制运算的类别,但是这种表示法使我认为我不了解某些内容。
被M ? M莫名其妙相关笛卡尔积,因此该射的域定义M x M?
编辑:在数学栈交换上,我的问题得到了非常有帮助的答案。
此代码编译错误:
def f1[T](e: T): T = e match {
case i:Int => i
case b:Boolean => b
}
// type mismatch;
// found : i.type (with underlying type Int)
// required: T
// case i:Int => i ...
Run Code Online (Sandbox Code Playgroud)
从类型检查角度看,实现GADT的代码看起来非常相同,但编译时没有错误:
sealed trait Expr[T]
case class IntExpr(i: Int) extends Expr[Int]
case class BoolExpr(b: Boolean) extends Expr[Boolean]
def eval[T](e: Expr[T]): T = e match {
case IntExpr(i) => i
case BoolExpr(b) => b
}
Run Code Online (Sandbox Code Playgroud)
在两种情况下,在模式匹配表达式中,我们知道i和b是Int和Boolean.为什么第一个例子编译失败而第二个例子成功?
ZIO不依赖于Cats,因此它具有自己的执行sequence操作的方法: ZIO.sequencePar和ZIO.sequence。
我尝试使用sequenceinterop提供的Cats,它的工作方式与ZIO.sequence:
import zio._
import zio.interop.catz._
import cats.implicits._
val t1: Task[Int] = ???
val t2: Task[Int] = ???
val t3: Task[Int] = ???
val seq = List(t1,t2,t3).sequence // <-- t1,t2,t3 are executed sequentially
(new DefaultRuntime {}).unsafeRun(seq)
Run Code Online (Sandbox Code Playgroud)
我可以ZIO将其sequence视为ZIO.sequencePar,这样我可以并行运行任务吗?
似乎ZIO需要一些Traversefor 的parallel 实现Cats,但我找不到任何实现。
这是我的依赖项:
libraryDependencies += "dev.zio" %% "zio" % "1.0.0-RC10-1"
libraryDependencies += "dev.zio" %% "zio-interop-cats" …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Visual Studio Code来运行 dotty 代码。我开始使用IDEsbt launchIDE根据来自指令这个页面,我也安装Dotty Language Server和Code Runner扩展。Dotty 是使用安装的brew,我可以从 CMD 编译和执行 dotty 代码。
问题是我无法运行此代码,Visual Studio Code因为我Code Runner试图使用 scala 而不是 dotty 来执行它。
找不到任何有用的配置来调整此插件以使用 dotty。
有什么方法可以让它从 Visual Studio Code UI 工作吗?
我试图至少在Scala 2.13中模拟联合类型的某些方面。
到目前为止,满足我需求的最佳方法是coproduct精打细算。唯一的问题是子类型不能按我预期的那样工作。这是一个例子:
import shapeless._
type ISB = Int :+: String :+: Boolean :+: CNil
type ISBSub = Int :+: String :+: CNil
implicitly[ISBSub <:< ISB] // error here
Run Code Online (Sandbox Code Playgroud)
我正在尝试创建一个带有类型参数的方法,ISB并希望它也def接受ISBSub。
def test(t: ISB) = ???
test(Coproduct[ISBSub](2)) // not working
Run Code Online (Sandbox Code Playgroud)
有什么办法可以实现这样的目标coproduct吗?
trait Base {
def someMethod: Unit
}
trait SomeTrait extends Base {
abstract override def someMethod: Unit = ???
}
class SomeTraitImp extends SomeTrait with Base {
override def someMethod: Unit = ???
}
Run Code Online (Sandbox Code Playgroud)
错误消息状态:
错误:在类型=>单位的特征SomeTrait中覆盖方法someMethod;方法someMethod需要“抽象覆盖”修饰符覆盖def someMethod:单位= ???
为什么Scala编译器会限制我覆盖此方法而不将其标记为抽象?
编辑:
我检查了这个答案,它解释了为什么abstract当我们引用super该方法时可能需要实现的方法上为什么需要关键字。
在我来说,我只是想覆盖someMethod在SomeTrait通过全新的实现,而不是试图打电话super.someMethod。
这种覆盖会在运行时破坏某些东西吗?
我想知道如何在Scala中将List [Try [T]]转换为Try [List [T]]?
我已经尝试过使用累加器并向右折叠,但这似乎并不理想。
我正在尝试在http4s服务器上的多个 http 请求之间共享状态。
这就是我尝试过的:
for {
state <- Ref[F].of(0)
_ <- BlazeServerBuilder[F]
.bindHttp(port, host)
.withHttpApp( ... httpApp that has link to "state" ... )
.serve.compile.lastOrError
} yield ()
Run Code Online (Sandbox Code Playgroud)
在 http 请求中更改状态后,状态保持不变。
是否可以使用Ref或 中的东西以纯 FP 风格共享“状态” Fs2?
更新:问题出在我的应用程序中。与我如何通过 Ref 无关。我的错。