我现在能以某种方式将ReactiveMongo与TypeSafe Stack集成吗?据我所知,ReactiveMongo需要Play!2.1它尚未准备好生产?有没有人有这样的积极经验?或者,如果我今天太梦幻,那么可能会估计这个组合什么时候可行?
我有一个简单的问题.如何在Windows下使用任何带有nodejs的SQLite库?我查看了sqlite3 lib,它需要特定于linux的编译.总的来说,这不是我第一次遇到这种类型的问题.和TameJS一样的问题.如果有人知道任何解决方案,我将不胜感激.谷歌是沉默的.
PS:Cygwin不是一个选择.目标应用程序应该是一个易于使用的便携式数据库,由nodejs驱动,并具有Web浏览器界面.
我正在阅读示例书中的Scala,几乎每个例子都有以下结构:
abstract class Stack[A] {
def push(x: A): Stack[A] = new NonEmptyStack[A](x, this)
def isEmpty: Boolean
def top: A
def pop: Stack[A]
}
class EmptyStack[A] extends Stack[A] {
def isEmpty = true
def top = error("EmptyStack.top")
def pop = error("EmptyStack.pop")
}
class NonEmptyStack[A](elem: A, rest: Stack[A]) extends Stack[A] {
def isEmpty = false
def top = elem
def pop = rest
}
Run Code Online (Sandbox Code Playgroud)
我有以下两个相互关联的问题:1)将空和非空元素表示为单独的类是一种常见的Scala实践吗?如果是,那为什么呢?2)为什么孩子们在可能的情况下都实现了同样的愚蠢方式'isEmpty',对我来说,在父母班级中这样做更明智?
我想知道这里涉及的最深刻的哲学.
我正在尝试在Scala和Processing中编写一个教程游戏,打算尽可能多地使用FP.但是,我得出结论,不可变状态游戏对象在这样的应用程序中是无利可图的.如果一个对象很大,那么在许多这样的对象被不断更新的情况下(因此,每个周期自己复制一次),例如使用copy()func ,它可能导致非常密集的内存消耗.坚决这个的默认方法是什么?我想出的唯一一件事就是将对象切成小块 - 对象,这样只有那些需要更新的对象才会被更新,同时让"大"对象保持不变.
在我的应用程序中,我想使用这样的特性:
trait HasBuffer[+A] {
var items = Buffer[A]()
def add[A](item: A) { items += item }
def remove[A](item: A) { items -= item }
def set(is: Buffer[A]) { items = is }
def clear { items clear }
}
Run Code Online (Sandbox Code Playgroud)
继承此特征的类应该能够缓冲作为类A的子类的任何类的实例.但是,在添加和删除方法上,编译器都抱怨正在添加或删除项目"类型不匹配;找到:需要item.type(带底层类型A):".我该怎么理解这个?这里我的错误是什么,该怎么办?
可能重复:
向集合添加元组不起作用
我有这个代码:
class A
var buffer = Buffer[(A, Int)]()
Run Code Online (Sandbox Code Playgroud)
然后,某处:
val a = new A
buffer += (a, 0) // error
Run Code Online (Sandbox Code Playgroud)
当我必须通过时,类型推断器a在(a, 0)告诉我通过A时失败(A, Int):
scala> def make {
| val a = new A
| buffer += (a, 0)
| }
<console>:11: error: type mismatch;
found : A
required: (A, Int)
buffer += (a, 0)
^
Run Code Online (Sandbox Code Playgroud)
但如果我这样做:
val a = new A
val tuple = (a, 0)
buffer += tuple
Run Code Online (Sandbox Code Playgroud)
错误消失了.这是某种错误还是我错过了什么?
我已经想到,为了为对象创建前缀方法,我可以:在方法名称的末尾使用,因此,我写道:
def aaa: {
}
Run Code Online (Sandbox Code Playgroud)
它编译得很好!但是,这是没用的,所以我想让方法返回一些东西,所以,不确定,我写道:
def aaa: = {
}
Run Code Online (Sandbox Code Playgroud)
错误!
- identifier expected but '=' found.
- not found: type <error>
Run Code Online (Sandbox Code Playgroud)
好的,我明白编译器坏了: =,我变得很好奇,我尝试:
def aaa: {
println("wow")
}
Run Code Online (Sandbox Code Playgroud)
再次出错!
illegal start of declaration (possible cause: missing `=' in front of current method body)
Run Code Online (Sandbox Code Playgroud)
然后我试试这个:
val a = aaa
Run Code Online (Sandbox Code Playgroud)
它说(悬停aaa)aaa签名是def aaa: AnyRef,所以我尝试:
def aaa: {
Global
}
Run Code Online (Sandbox Code Playgroud)
这里Global是一个object.还是错误.所以,我的问题是:为什么允许这种语法?我不能使它像前缀方法一样工作,我不能使用这种方法的副作用,我不能让它返回任何东西.为什么它允许我首先这样写?
更新:
现在我试试这个:
def aaa: {} = { …Run Code Online (Sandbox Code Playgroud) 在我的代码中,我有以下内容:
type Occurrences = List[(Char, Int)]
def subtract(x: Occurrences, y: Occurrences): Occurrences = {
val yMap = y.toMap
x foldLeft (List[(Char, Int)]()) { // ERROR
case (a: List[(Char, Int)], xe: (Char, Int)) =>
if(yMap.contains(xe._1)) (xe._1 -> (xe._2 - yMap(xe._1))) :: a
else a
}
}
Run Code Online (Sandbox Code Playgroud)
它在编译时失败,就{在代码中的错误标记之前.错误消息如下:
扩展函数缺少参数类型必须完全知道匿名函数的参数类型.(SLS 8.5)预期类型为:Int
1)怎么会这样?据我所知,这里没有错误解释类型信息的余地,我在互联网上发现了很多这样的例子.我该如何解决这个问题?
2)为什么它认为预期的类型Int毕竟是?
我有以下类层次结构:
trait Entity {
type E <: Entity
type S <: Something[E]
def in: S
}
trait Something[E <: Entity] {
def doSomething {
// something
}
}
class A extends Entity {
def in = InA
object InA extends Something[A]
}
class B extends Entity {
def in = InB
object InB extends Something[B]
}
class C extends Entity {
def in = InC
object InC extends Something[C]
}
Run Code Online (Sandbox Code Playgroud)
以及我想要的其他地方:
val entities = Seq[Entity]
entities.map(_.in.doSomething)
Run Code Online (Sandbox Code Playgroud)
但是,类型系统不允许我逃避该in方法定义 - …
不确定如何正确地表达问题,在Scala by Example book(第69页)的合并排序示例中存在问题.该函数定义如下:
def msort[A](less: (A, A) => Boolean)(xs: List[A]): List[A] = {
def merge(xs1: List[A], xs2: List[A]): List[A] =
if (xs1.isEmpty) xs2
else if (xs2.isEmpty) xs1
else if (less(xs1.head, xs2.head)) xs1.head :: merge(xs1.tail, xs2)
else xs2.head :: merge(xs1, xs2.tail)
val n = xs.length/2
if (n == 0) xs
else merge(msort(less)(xs take n), msort(less)(xs drop n))
}
Run Code Online (Sandbox Code Playgroud)
然后有一个例子说明如何通过currying从中创建其他函数:
val intSort = msort((x : Int, y : Int) => x < y)
val reverseSort = msort((x:Int, y:Int) => x > …Run Code Online (Sandbox Code Playgroud)