小编Lui*_*hys的帖子

Stream什么时候需要懒惰?

以下两个都是为了创建一个整数流:

val s: Stream[Int] = 1 #:: s.map(_ + 1)

def makeStream = {
  val s: Stream[Int] = 1 #:: s.map(_ + 1)
  s
}
Run Code Online (Sandbox Code Playgroud)

第一个很好; 但是该makeStream方法不会编译:

error: forward reference extends over definition of value s
  val s: Stream[Int] = 1 #:: s.map(_ + 1)
                             ^
Run Code Online (Sandbox Code Playgroud)

它只会编译,如果我们做s一个lazy val.为什么它需要lazy val在一个方法中,但不在外面?

scala stream lazy-evaluation

12
推荐指数
1
解决办法
536
查看次数

SBT 0.10和IDEA的初学者指南

我是SBT的新手,不确定如何启动项目.有人能指出我创建Hello World类型项目的初学者指南,还是给我一些线索?

我首选的IDE是IDEA.我sbt-idea按照IDEA插件页面上的说明运行.目前我有点困惑,因为

  • 没有创建源文件夹 - 我应该在哪里/如何创建它们以及SBT将如何知道在哪里看?
  • 为什么它试图使用Scala的2.8.1,当我已经把scalaVersion := "2.9.0"build.sbt文件?这意味着IDEA无法识别object HelloWorld extends App {}.
  • 上面插件页面上的说明建议更改"运行配置(包括默认运行配置)"的"启动前"选项.列出的不同内容有13种不同的默认配置 - 哪一种要更改?我应该创建一个新的吗?这些默认配置仅适用于此项目,还是会对我不使用SBT的所有其他项目产生负面影响?

谢谢.

scala intellij-idea sbt sbt-idea

11
推荐指数
1
解决办法
7199
查看次数

在Scala中,是否有缩写泛型类型的简写的简写?

我想调用Scalaz的pure方法将值放入State monad.以下作品:

type IntState[A] = State[Int, A]
val a = "a".pure[IntState]
a(1)
    (Int, java.lang.String) = (1,a)
Run Code Online (Sandbox Code Playgroud)

我也可以删除类型别名(感谢Scalaz的Pure.scala):

val a = "a".pure[({type T[A]=State[Int,A]})#T]
a(1)
    (Int, java.lang.String) = (1,a)
Run Code Online (Sandbox Code Playgroud)

但这非常笨重.是否有更短的方法来合成这样的类型?就像函数文字的占位符语法一样,有类似的东西:

"a".pure[State[Int, *]]
Run Code Online (Sandbox Code Playgroud)

generics scala scalaz

11
推荐指数
2
解决办法
752
查看次数

与AnyRef的奇怪模式匹配行为

def test1(a: Any) = a match {
  case x: AnyRef => "AnyRef"
  case _ => "None of the above"
}

def test2(a: Any) = a match {
  case x: Double if x > 2 => "Double > 2"
  case x: AnyRef => "AnyRef"
  case _ => "None of the above"
}
Run Code Online (Sandbox Code Playgroud)

请有人解释为什么在下面,第一个案例1.0匹配AnyRef,但在第二个案例中没有.(斯卡拉2.9.0-1)

scala> test1(1.0)
res28: java.lang.String = AnyRef

scala> test2(1.0)
res29: java.lang.String = None of the above
Run Code Online (Sandbox Code Playgroud)

编辑 - Scala 2.10更新2013年1月:新模式匹配器修复了这种行为(或者至少使其保持一致),test2现在该方法返回"AnyRef" test1.

scala pattern-matching

11
推荐指数
1
解决办法
1001
查看次数

模式匹配期间需要稳定的标识符?(斯卡拉)

试图生成一个显示素数因子多样性的元组列表...这个想法是将排序列表中的每个整数与元组中的第一个值匹配,使用第二个值进行计数.可能更容易做到takeWhile,但是,好吧.不幸的是我的解决方案无法编译

  def primeFactorMultiplicity (primeFactors: List[Int]) = {

    primeFactors.foldRight (List[(Int, Int)]()) ((a, b) => (a, b) match {
      case (_, Nil)       => (a, 1) :: b
      case (b.head._1, _) => (a, b.head._2 + 1) :: b.tail
      case _              => (a, 1) :: b
    })
  }
Run Code Online (Sandbox Code Playgroud)

它说"错误:需要稳定的标识符,但发现了b.head._1".但是将第二case行更改为以下内容可以正常工作:

      case (i, _) if (i == b.head._1) => (a, b.head._2 + 1) :: b.tail
Run Code Online (Sandbox Code Playgroud)

为什么会这样,为什么编译器无法应对这样一个简单的修复?

scala pattern-matching

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

IntelliJ和SVN:提交时"未检测到任何更改"

我正在尝试使用Subversion在桌面和笔记本电脑之间共享项目.该项目有3个模块.我已将项目文件夹导入到我的笔记本电脑可以通过网络访问的共享文件夹中的存储库中.

我在笔记本电脑上检查了项目,然后尝试打开项目.所有模块都不可见,只有项目的.iml文件,如下面的屏幕截图所示.

我注意到.iml文件有一行"content url",它指的是我桌面上的一个位置.也许这就是问题所在.我能做些什么呢?我是否必须在笔记本电脑上创建一个新项目并导入模块 - 因此会有2个不同的顶级.iml文件,一个用于桌面,一个用于笔记本电脑?我是以错误的方式来做这件事的吗?

的IntelliJ

更新:问题似乎在于提交.当我在文件中进行更改,保存并点击Commit Changes时,我会弹出一个"未检测到更改"的弹出窗口.这在笔记本电脑和台式机上都是一样的,这意味着我之前在笔记本电脑上下载了错误的版本.我删除了存储库并创建了一个新的存储库,我的项目现在可以在我的笔记本电脑上运行,但我不能在IntelliJ中提交更改(仅通过文件管理器使用TortoiseSVN).此外,当我从桌面计算机将项目导入版本控制时,工作副本未置于版本控制之下.所以我无法从我的桌面更新,除非我检查到另一个文件夹.

我认为这个版本的IntelliJ(10.5.1)的SVN插件有问题.是否有其他人在提交更改时遇到问题?

决议我需要1)更新设置| 版本控制将Subversion映射到工作目录2)导入到版本控制中3)再次检出

这可能是因为模块最初是独立的项目,这些项目位于不同的存储库中.无论原因是什么,IntelliJ的"未检测到更改"对话框都不是最有用的.

java svn intellij-idea

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

在没有命令窗口的Windows上启动Scala Swing应用程序

我在一个.jar文件中用Scala编写了一个Swing应用程序.我用一个有效的命令创建了一个桌面快捷方式scala "filepath\filename.jar",除了它首先显示一个命令窗口,它位于后台,直到我关闭应用程序.我想让它消失.

我相信你应该使用Java javaw而不是java为了这个目的.我尝试将scala.bat文件复制到一个名为scalaw.batto 的新文件,并将第24行更改为

if exist "%JAVA_HOME%\bin\javaw.exe" set "_JAVACMD=%JAVA_HOME%\bin\javaw.exe" 
Run Code Online (Sandbox Code Playgroud)

和第28行到

if "%_JAVACMD%"=="" set _JAVACMD=javaw
Run Code Online (Sandbox Code Playgroud)

但是(更新桌面快捷方式后)我仍然会收到命令窗口.有任何想法吗?


更新:我尝试添加scala-library.jar到清单但它不起作用,我想因为路径是相对于jar的根.其他选项似乎包括jar文件中的整个scala-library jar (从Scala文件创建一个jar文件),但我不认为这是一个解决方案.

或者我可以将jar解压缩到其组成.class文件并使用快捷方式

javaw.exe -cp "%SCALA_HOME%/lib/scala-library.jar";"filepath\\" packageName.className

但是......这涉及到打开罐子的包装.

我发现的另一个半解决方法是编辑快捷方式,以便命令窗口最小化运行.


解决方案:根据eugener的回答,您需要在javaw 没有 -jar选项的情况下使用,但需要指定jar文件,例如

javaw -cp "%SCALA_HOME%/lib/*";"C:/path/yourjar.jar" packageName.className
Run Code Online (Sandbox Code Playgroud)

如果它是一个Swing应用程序并且您使用该scala-swing库,您还需要包含它,或者使用*上面的通配符.

java windows swing scala jar

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

什么时候对Stream的头部进行评估?

通常,如果您创建一个Stream对象,则会热切地评估头部:

scala> Stream( {println("evaluating 1"); 1} , 2, 3)
evaluating 1
res63: scala.collection.immutable.Stream[Int] = Stream(1, ?)
Run Code Online (Sandbox Code Playgroud)

如果我们创建一个我们在同一语句中添加的Stream,那么在连接之前不会对头进行求值似乎有点令人惊讶.即

scala> 0 #:: Stream( {println("evaluating 1"); 1} , 2, 3)
res65: scala.collection.immutable.Stream[Int] = Stream(0, ?)
Run Code Online (Sandbox Code Playgroud)

(#::是右关联的,是prepend方法ConsWrapper,它是一个隐式类Stream.)

在预先设定0之前,这怎么不评价它的头?在我们从结果流中获取值之前,堆尾流(或缺点单元格)是否存在于堆中?但如果是这样,我们如何#::在一个不存在的对象上调用该方法呢?

scala stream lazy-evaluation

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

使用map变异可变集合?

如果你有像a这样的可变数据结构Array,是否可以使用map操作或类似的东西来改变它的值?

说我有val a = Array(5, 1, 3),最好的说法,从每个值中减去1?我想出的最好的是

for(i <- 0 until a.size) { a(i) = a(i) - 1 }
Run Code Online (Sandbox Code Playgroud)

我想方法是使数组成为一个var而不是一个val我可以说的

a = a map (_-1)
Run Code Online (Sandbox Code Playgroud)

编辑:如果内置任何内容,相当容易自己滚动,虽然我不知道如何推广到其他可变集合

scala> implicit def ArrayToMutator[T](a: Array[T]) = new {
     |   def mutate(f: T => T) = a.indices.foreach {i => a(i) = f(a(i))}
     | }
ArrayToMutator: [T](a: Array[T])java.lang.Object{def mutate(f: (T) => T): Unit}

scala> val a = Array(5, 1, 3)
a: Array[Int] = Array(5, 1, 3) …
Run Code Online (Sandbox Code Playgroud)

scala

9
推荐指数
1
解决办法
1136
查看次数

了解并行存在并找到

我采取List[Int]和要搜索的值x,其中x * 10 > 500并行.因此,如果列表包含任何值51或更大,exists则应返回true.

def f(x: Int) = {
  println("calculating for " + x)
  Thread.sleep(100 - x)
  println("finished " + x)
  x * 10
}

val res = List.range(1, 100).par.exists(f(_) > 500)
Run Code Online (Sandbox Code Playgroud)

结果如下:

calculating for 1
calculating for 25
calculating for 50
calculating for 75
calculating for 13
finished 75          // <-- first valid result found: 75 * 10 > 500
finished 50
calculating for 51   // but it …
Run Code Online (Sandbox Code Playgroud)

parallel-processing scala parallel-collections

9
推荐指数
1
解决办法
556
查看次数