Tag: scala

如何在Scala中读取环境variables

在Java中,读取环境variables是通过System.getenv() 。 有没有办法在斯卡拉这样做?

Scala中的模式匹配如何在字节码级别实现?

Scala中的模式匹配如何在字节码级别实现? 它是否就像一系列if (x instanceof Foo)构造,还是其他的? 它的性能影响是什么? 例如,给定以下代码(来自Scala示例页面46-48), eval方法的等效Java代码将如何显示? abstract class Expr case class Number(n: Int) extends Expr case class Sum(e1: Expr, e2: Expr) extends Expr def eval(e: Expr): Int = e match { case Number(x) => x case Sum(l, r) => eval(l) + eval(r) } PS我可以读取Java字节码,所以一个字节码表示对我来说就足够了,但是对其他读者来说可能会更好地知道它是怎么样的Java代码。 PPS Scala编程书籍是否给出了有关Scala如何实现的类似问题的答案? 我已经订购了这本书,但还没有到。

什么JSON库在Scala中使用?

我需要build立一个JSONstring,如下所示: [ { 'id': 1, 'name': 'John'}, { 'id': 2, 'name': 'Dani'} ] val jArray = JsArray(); jArray += (("id", "1"), ("name", "John")) jArray += (("id", "2"), ("name", "Dani")) println(jArray.dump) 我需要能够添加行到jArray ,就像jArray += … 最接近的图书馆/解决scheme是什么?

用Scalaz 7 zipWithIndex /组枚举避免内存泄漏

背景 正如在这个问题中指出的,我正在使用Scalaz 7迭代来处理恒定堆空间中的大量(即无界)数据stream。 我的代码如下所示: type ErrorOrT[M[+_], A] = EitherT[M, Throwable, A] type ErrorOr[A] = ErrorOrT[IO, A] def processChunk(c: Chunk, idx: Long): Result def process(data: EnumeratorT[Chunk, ErrorOr]): IterateeT[Vector[(Chunk, Long)], ErrorOr, Vector[Result]] = Iteratee.fold[Vector[(Chunk, Long)], ErrorOr, Vector[Result]](Nil) { (rs, vs) => rs ++ vs map { case (c, i) => processChunk(c, i) } } &= (data.zipWithIndex mapE […]

了解为什么Zipper是一个Comonad

这是对我以前的问题的回答。 假设我需要将函数def f(a:A, leftNeighbors:List[A]): B并且生成List[B]每个项目a:A List[A]映射到b:B . 显然,我不能只是在列表中调用map ,但我可以使用列表拉链 。 拉链是一个在列表中移动的游标。 它提供对当前元素( focus )及其邻居的访问。 现在我可以用def f'(z:Zipper[A]):B = f(z.focus, z.left)来代替我的f ,并将这个新函数f'传递给Zipper[A] cobind方法。 cobind工作原理是这样的:它用拉链调用f' ,然后移动拉链,用新的 “移动”拉链调用f' ,再次移动拉链等,依此类推…直到拉链到达名单末尾。 最后, cobind返回一个types为Zipper[B]的新拉链Zipper[B] ,它可以转换成列表,这样问题就解决了。 现在注意cobind[A](f:Zipper[A] => B):Zipper[B]和bind[A](f:A => List[B]):List[B]之间的对称性bind[A](f:A => List[B]):List[B] Monad和Zipper是Comonad 。 是否有意义 ?

scala对推断types的“可接受的复杂性”有何限制?

根据斯卡拉语言规范 : …允许局部types推断来限制[types参数]的推断界限的复杂性。 types的最小性和最大性必须相对于可接受复杂性types的集合来理解。 在实践中有什么限制? 此外,是否有不同的限制,适用于推断expression式types比参数types界限,这些限制是什么?

在Scala的模式匹配系统中使用比较运算符

在Scala中使用模式匹配系统进行比较可以匹配吗? 例如: a match { case 10 => println("ten") case _ > 10 => println("greater than ten") case _ => println("less than ten") } 第二种情况是非法的,但我希望能够指出“何时比a大”。

当case类包含一个scala枚举时,如何使用带有MongoCaseClassField的Rogue更新mongologging

我将现有代码从Rogue 1.1.8升级到2.0.0并将2.4-M5 to 2.5 lift-mongodb-record 2.4-M5 to 2.5 。 我很难编写包含scala枚举的MongoCaseClassField ,我真的可以使用一些帮助。 例如, object MyEnum extends Enumeration { type MyEnum = Value val A = Value(0) val B = Value(1) } case class MyCaseClass(name: String, value: MyEnum.MyEnum) class MyMongo extends MongoRecord[MyMongo] with StringPk[MyMongo] { def meta = MyMongo class MongoCaseClassFieldWithMyEnum[OwnerType <: net.liftweb.record.Record[OwnerType], CaseType](rec : OwnerType)(implicit mf […]

HL主义者只不过是一种复杂的写作方式而已?

我真的有兴趣找出差异在哪里,更一般地说,是要确定不能使用HList的规范用例(或者说,不会比常规列表产生任何好处)。 (我知道在Scala中有22个(我相信) TupleN ,而一个只需要一个HList,但这不是我感兴趣的那种概念差异。) 我在下面的文字中标出了几个问题。 实际上可能没有必要回答这些问题,他们更多的是指出我不清楚的事情,并指导讨论在某些方面。 动机 我最近在SO上看到了一些关于人们build议使用HList(例如, Shapeless提供的)的答案,包括删除了这个问题的答案。 这引起了这个讨论 ,这又引发了这个问题。 介绍 在我看来,只有当你知道元素的数量和它们的精确types时,列表才是有用的。 这个数字实际上并不重要,但是您似乎不太可能需要生成一个列表,其中包含不同但静态精确的已知types的元素,但是您不会静态地知道它们的数量。 问题1:你甚至可以写这样一个例子,例如,在一个循环? 我的直觉是,具有静态未知数的任意元素(相对于给定的类层次结构是任意的)的静态精确的hlist只是不兼容。 HLists与元组 如果这是真的,也就是说,你静静地知道数字和types – 问题2:为什么不使用一个n-元组? 当然,你可以types化地映射和折叠一个HList(你也可以,但不能types化,在productIterator的帮助下通过一个元组来完成),但是因为元素的数量和types是静态的,所以你可能只需要访问元组元素直接执行操作。 另一方面,如果你在hlist上映射的函数是通用的,它接受所有的元素 – 问题3:为什么不通过productIterator.map使用它? 好的,一个有趣的差异可能来自方法重载:如果我们有几个重载的f ,具有由hlist提供的更强types信息(与productIterator相比)可以允许编译器select更具体的f 。 但是,我不确定这是否会在Scala中起作用,因为方法和函数是不一样的。 HLists和用户input 基于相同的假设,即你需要静态地知道元素的数量和types – 问题4:在元素依赖于任何types的用户交互的情况下,能否使用它? 例如,想象用循环内的元素填充一个hlist; 元素是从某处(UI,configuration文件,演员互动,networking)读取,直到某个条件成立。 什么样的Hlist是什么? 类似于接口规范getElements:HList,它应该与静态未知长度的列表一起工作,并且允许系统中的组件A从组件B获得这样的任意元素的列表。

如何在Scala中优化理解和循环?

所以Scala应该和Java一样快。 我正在重新讨论我最初在Java中处理的Scala中的一些Project Euler问题。 具体问题5:“从1到20的所有数字均匀分布的最小正数是多less?” 这是我的Java解决scheme,需要0.7秒才能在我的机器上完成: public class P005_evenly_divisible implements Runnable{ final int t = 20; public void run() { int i = 10; while(!isEvenlyDivisible(i, t)){ i += 2; } System.out.println(i); } boolean isEvenlyDivisible(int a, int b){ for (int i = 2; i <= b; i++) { if (a % i != 0) return false; } […]