我正在实现一个数据结构.虽然它没有直接混合Scala的任何标准集合特性,但我希望包含一个to[Col[_]]方法,在给定构建器工厂的情况下,该方法可以生成标准的Scala集合.
现在假设这个,复制自GenTraversableOnce:
trait Foo[+A] {
def to[Col[_]](implicit cbf: CanBuildFrom[Nothing, A, Col[A]]): Col[A]
}
Run Code Online (Sandbox Code Playgroud)
这失败了error: covariant type A occurs in invariant position.
那怎么能GenTraversableOnce实现呢?我可以在源代码中看到,他们添加了annotation.unchecked.uncheckedVariance...
这看起来像一个肮脏的把戏.如果typer正常拒绝这个,那怎么能安全并且关掉uncheckedVariance?
我试图弄清楚如何编写一个适用于任何函数的函数交换函数Traversable[_],给定一个集合和交换索引.我想出了以下内容:
def swap[A, CC <% Traversable[A]](xs: CC, i: Int, j: Int): Traversable[A] = {
xs.slice(0, i) ++
xs.slice(j, j+1) ++
xs.slice(i+1, j) ++
xs.slice(i, i+1) ++
xs.slice(j+1, xs.size)
}
swap(List(1,2,3,4,5), 0, 4) // => List(5,2,3,4,1)
Run Code Online (Sandbox Code Playgroud)
我想知道如何将它变成Traversable的隐式扩展,让我可以调用它List(1,2,3,4,5).swap(0, 4).我能得到的最接近的是:
import language.implicitConversions
class RichTraversable[A, B <% Traversable[A]](xs: B) {
def swap(i: Int, j: Int): Traversable[A] = {
xs.slice(0, i) ++
xs.slice(j, j+1) ++
xs.slice(i+1, j) ++
xs.slice(i, i+1) ++
xs.slice(j+1, xs.size)
}
}
implicit def richTraversable[A, B <% Traversable[A]](ys: …Run Code Online (Sandbox Code Playgroud) 我试图理解名字类型注释在高阶函数的上下文中的含义.这是一个例子:
object Test {
def apply[A, B](f: (=> A) => B, x: => A): B = f(x)
def const[A](ignored: A): Int = 1
val res: Int = apply(const, ???)
}
Run Code Online (Sandbox Code Playgroud)
const它的参数是严格的(即它缺少一个=>注释),那么为什么不强制它的参数(???在这种情况下是这样)并引发异常?
是否有一篇描述语义的论文?
我在这里寻找权威的答案.
我认为这应该是直截了当的:
import spire.math.Rational
val seq = Vector(Rational(1, 4), Rational(3, 4))
val sum = seq.sum // missing: scala.Numeric
val prod = seq.product // missing: scala.Numeric
Run Code Online (Sandbox Code Playgroud)
我想这只是将正确的东西带入隐含范围的问题.但是我要导入什么?
我可以看到,为了得到一个RationalIsNumeric,我必须做这样的事情:
import spire.math.Numeric._
implicit val err = new ApproximationContext(Rational(1, 192))
implicit val num = RationalIsNumeric
Run Code Online (Sandbox Code Playgroud)
但那只是给了我一个spire.math.Numeric.所以我另外尝试这个:
import spire.math.compat._
Run Code Online (Sandbox Code Playgroud)
但没有运气......
看着http://www.scala-sbt.org/release/docs/Howto/scaladoc.html有给了scaladoc选择这样的例子-groups和-implicits.
有关scaladoc(2.10)选项的信息在哪里?就像一个手册页.我似乎无法找到它,既不是docs.scala-lang.org,也不是wiki.scala-lang.org ......
除了由sbt管理之外我不使用Scala安装,所以我真的想要一个在线资源.
让我们说我foo从版本1.0.0到库创建了我的库的二进制兼容更新1.0.1.图书馆foo通过Maven发布.
我是否可以使用此次要版本更新来同时修复依赖项的次要版本foo?例如,版本1.0.0正在使用scalaVersion := "2.10.1".我可以将其更改为scalaVersion := "2.10.3"foo 1.0.1,还是会导致麻烦?
假设我foo在另一个项目中使用
"mygroup" %% "foo" % "1.0.+"
Run Code Online (Sandbox Code Playgroud) 鉴于异构类型:
trait Request {
type Result
}
trait IntRequest extends Request {
type Result = Int
}
Run Code Online (Sandbox Code Playgroud)
如何让Scala编译器满意地根据模式匹配返回路径依赖类型:
def test(in: Request): in.Result = in match {
case i: IntRequest => 1234
case _ => sys.error(s"Unsupported request $in")
}
Run Code Online (Sandbox Code Playgroud)
错误:
<console>:53: error: type mismatch;
found : Int(1234)
required: in.Result
case i: IntRequest => 1234
^
Run Code Online (Sandbox Code Playgroud) 我不确定我@volatile在这里使用得当.我有一个缓冲区,像这样:
final class BufD(val buf: Array[Double], @volatile var size: Int)
Run Code Online (Sandbox Code Playgroud)
哪个在进程之间发送,从而可能跨越线程边界.发件人可以size在发送之前更新字段.因此,我想确保接收器在任何情况下都不能size在这里看到陈旧的值.第一个问题:是否@volatile确保这或者是多余的?
现在我介绍一个特点:
trait BufLike {
@volatile var size: Int
}
final class BufD(val buf: Array[Double], @volatile var size: Int) extends BufLike
Run Code Online (Sandbox Code Playgroud)
这给了我一个编译器警告:
警告:(6,4)没有方法大小的注释的有效目标 - 它被丢弃未使用.您可以使用元注释指定目标,例如@(volatile @getter)
Run Code Online (Sandbox Code Playgroud)@volatile var size: Int ^
第二个问题:我应该删除@volatile此处还是以不同方式更改它?
我正在尝试使用OpenCV重建我之前在Gimp中完成的一些预处理.第一阶段是用于边缘检测的Sobel滤波器.它在Gimp中非常有效:
现在这是我对OpenCV的尝试:
opencv_imgproc.Sobel(/* src = */ scaled, /* dst = */ sobel,
/* ddepth = */ opencv_core.CV_32F,
/* dx = */ 1, /* dy = */ 1, /* ksize = */ 5, /* scale = */ 0.25,
/* delta = */ 0.0, /* borderType = */ opencv_core.BORDER_REPLICATE)
Run Code Online (Sandbox Code Playgroud)
它看起来非常糟糕,基本上突出了点而不是轮廓:
那么我做错了什么,或者Gimp如何实现如此好的结果?如何在OpenCV中复制它?
我不是在寻找一种链接到Youtube的方法.我想引用一个自托管的mp4文件.
我已经有{% audio my-file.mp3 %}工作了.
我正在寻找一个等价物{% video my-file.mp4 %}.
如果我<video ... />直接使用,我会在my-text.md中收到错误"Liquid exception:Unknown tag'video'".
编辑:我认为有一个现有的Octopress插件.但是如何安装/让Jekyll知道?