小编Pet*_*itz的帖子

三元运算符类似于?:

我试图避免像这样的结构:

val result = this.getClass.getSimpleName
if (result.endsWith("$")) result.init else result
Run Code Online (Sandbox Code Playgroud)

好吧,在这个例子中,thenelse分支很简单,但你可以对复杂的图像进行成像.我建立了以下内容:

object TernaryOp {
  class Ternary[T](t: T) {
    def is[R](bte: BranchThenElse[T,R]) = if (bte.branch(t)) bte.then(t) else bte.elze(t)
  }
  class Branch[T](branch: T => Boolean) {
    def ?[R] (then: T => R) = new BranchThen(branch,then)
  }
  class BranchThen[T,R](val branch: T => Boolean, val then: T => R)
  class Elze[T,R](elze: T => R) {
    def :: (bt: BranchThen[T,R]) = new BranchThenElse(bt.branch,bt.then,elze)
  }
  class BranchThenElse[T,R](val branch: T => Boolean, val …
Run Code Online (Sandbox Code Playgroud)

scala

88
推荐指数
4
解决办法
6万
查看次数

A类有一个类型参数,但B类有一个

最近我偶然发现了一个奇怪的(对我而言)编译器错误消息.请考虑以下代码:

trait Foo {
  type Res <: Foo
  type Bar[X <: Res]
}

class MyFoo extends Foo {
  override type Res = MyFoo
  override type Bar[X <: Res] = List[X]
}

type FOO[F <: Foo, R <: Foo, B[_ <: R]] = F { type Res = R; 
                                              type Bar[X <: R] = B[X] }

def process[F <: Foo, R <: Foo, B[_ <: R]](f: FOO[F, R, B]) {}
Run Code Online (Sandbox Code Playgroud)

现在,如果我想调用process方法,我必须显式写入类型参数:

process[MyFoo, MyFoo, List](new MyFoo) // fine
Run Code Online (Sandbox Code Playgroud)

如果我写:

process(new …
Run Code Online (Sandbox Code Playgroud)

scala

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

案例类和隐式参数和模式匹配

我试图将隐式参数与案例类结合起来,但我陷入困境.

case class C(i: Int)(implicit b: Boolean)
val c1 = C(1)(true)
implicit val b = true
val c2 = C(2)
c1 match {
  case C(i)(b) => // doesn´t work
  case C(i,b)  => // doesn´t work
  case C(i)    => // works, but wanted: if (b) i else 0 
}
Run Code Online (Sandbox Code Playgroud)

根据Scala语言规范,由于编译器为case类生成了提取器对象:我的隐式Boolean不是结果case类的成员,所以它必须在第二个(隐式)参数列表中(我可以'不幸的是,在伴侣对象的apply方法中找到了:

c[tps](ps1 ). . .(psn)带有类型参数tps和值参数的案例类定义ps隐式生成一个提取器对象(第8.1.8节),其定义如下:

object c {
  def apply[tps](ps1 ). . .(psn): c[tps] = new c[Ts](xs1 ). . .(xsn)
  def unapply[tps](x: c[tps]) =
    if …
Run Code Online (Sandbox Code Playgroud)

scala

16
推荐指数
2
解决办法
8787
查看次数

命名参数中的下划线

有人能解释一下这到底发生了什么吗?我现在还没有充分考虑到它:

val s = Seq(1D,2D,3D,4D)
case class WithUnit(value: Double, unit: String)
s map { WithUnit(_,"cm") } // works
s map { WithUnit(value = _ , unit = "cm") } // error: missing parameter type for expanded function ((x$2) => value = x$2)
Run Code Online (Sandbox Code Playgroud)

我想编译器不能推断参数类型,因为我写了参数的名称.但为什么不呢?它只是因为陈述参数的名称而不应该更加困难?!

谢谢!

scala

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

从Seq转换为Set并返回Seq

直观地说,以下应该起作用:

case class I(i: Int)
val s = Seq(I(1),I(2),I(3))
s.sortBy(_.i)             // works
s.toSeq.sortBy(_.i)       // works
s.toSet.toSeq.sortBy(_.i) // doesn´t work
Run Code Online (Sandbox Code Playgroud)

为什么它的表现不如预期?

scala

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

类型参数minBy [B](f:((A,B))⇒B)(隐式cmp:订购[B]):( A,B)

特质Map[A,+B]有一种方法

def minBy [B] (f: ((A, B)) ? B)(implicit cmp: Ordering[B]): (A, B)
Run Code Online (Sandbox Code Playgroud)

我期望B特性与方法中的特性相同,但后来我仍然无法理解:

val m2 = Map('a -> "1", 'b ->"2" ,'c ->"3")
m2.minBy((t:(Symbol,String))=>Integer.parseInt(t._2))
Run Code Online (Sandbox Code Playgroud)

这里BMap[A,+B]就是String,不过BminBy就是Int-或犯错吗?

所以我期望该方法的类型是相当的

def minBy [C] (f: ((A, B)) ? C)(implicit cmp: Ordering[C]): (A, B)
Run Code Online (Sandbox Code Playgroud)

但这不是消息来源所说的.

如果两者都不同,我应该知道哪里?如果他们不是 - 你能发现并指出我的错误吗?

scala type-parameter

10
推荐指数
2
解决办法
623
查看次数

算术表达式语法和解析器

最近我一直在为算术表达式寻找一个合适的语法,但发现只有微不足道的语法pow(..., ...),例如忽略了.然后我自己尝试了,但有时它没有按照预期工作.例如,我错过了-在表达式前允许一元并修复它.也许有人可以看看我目前的方法并改进它.此外,我认为其他人可以利用,因为能够解析算术表达式是一项常见任务.

import scala.math._
import scala.util.parsing.combinator._
import scala.util.Random

class FormulaParser(val constants: Map[String,Double] = Map(), val userFcts: Map[String,String => Double] = Map(), random: Random = new Random) extends JavaTokenParsers {
  require(constants.keySet.intersect(userFcts.keySet).isEmpty)
  private val allConstants = constants ++ Map("E" -> E, "PI" -> Pi, "Pi" -> Pi) // shouldn´t be empty
  private val unaryOps: Map[String,Double => Double] = Map(
   "sqrt" -> (sqrt(_)), "abs" -> (abs(_)), "floor" -> (floor(_)), "ceil" -> (ceil(_)), "ln" -> (math.log(_)), "round" -> (round(_)), "signum" …
Run Code Online (Sandbox Code Playgroud)

scala parser-combinators

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

它是一种具有特征和同样命名的对象的好风格吗?

当我浏览Paul Phillips GitHub存储库时,我注意到他经常使用某种结构:

trait A {
 // ...
}
object A extends A
Run Code Online (Sandbox Code Playgroud)

例如这里:scala- improvement ,strings首先,来自Java,我不知道在同一范围内具有相同的特征和特征的对象.
现在我问它有什么好处?与所有特征成员直接定义对象有什么好处?好吧,我知道这个特性可以混入,但我假设在实践中只使用了这个对象.

scala

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

从Any到Dynamic的隐式转换

以下为什么不工作?(是的,我正在使用2.9.0final并打开" -Xexperimental "选项.)

implicit def any2Dynamic(a: Any) = new Dynamic {
  def applyDynamic(name: String)(args: Any*) = {
    println(a + name)
  }
}

"Say".hello // value hello is not a member of java.lang.String
Run Code Online (Sandbox Code Playgroud)

人们可以争论这是多么有意义......如果这将按预期工作,优先权将发生在"Say".toInt:StringLike.toInt(new Dynamic {...}).applyDynamic("toInt")

scala dynamic-typing

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

地图地图的4元组序列

我需要一种更简洁的方法将元组序列转换为地图映射图...作为签名,我得到以下情况Tuple4:

def tuple4Seq2MapOfMaps[A,B,C,D](seq: Seq[(A,B,C,D)]): Map[A,Map[B,Map[C,D]]]
Run Code Online (Sandbox Code Playgroud)

下面的代码显示了我最近的丑陋代码,我坚持(类型AD任意):

type A = Int
type B = Double
type C = String
type D = Boolean
val tupleSeq = Seq[(A,B,C,D)](
  (1,1.0D,"a",true),
  (1,1.0D,"b",true),
  (1,1.0D,"c",false)
)
val x = tupleSeq.groupBy{ _._1 }.map{ case (k,s) => (k,s.map{ x => (x._2,x._3,x._4) }) }
val y = x.map{ case (k,s) => (k,s.groupBy{_._1}.map{ case (k,s) => (k,s.map{ x => (x._2,x._3) }) }) }
val z = y.map{ case (k1,m) => (k1,m.map{ case …
Run Code Online (Sandbox Code Playgroud)

scala

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