0

我是 Scala 的新手,并尝试以实用的方式使用它。以下是我的问题:

  1. 为什么我不能使用“<-”运算符为具有函数返回值的“cnt”变量创建新绑定?

  2. 如何以函数方式增加不可变变量(类似于 Haskell <-)?为了实验,我不想使用可变变量。

    import scala.io.Source
    object MyProgram {
    
      def main(args: Array[String]): Unit = {
        if (args.length > 0) {
          val lines = Source.fromFile(args(0)).getLines()
          val cnt = 0
          for (line <- lines) {
            cnt <- readLines(line, cnt)
          }
          Console.err.println("cnt = "+cnt)
        }
      }
    
      def readLines(line: String, cnt:Int):Int = {
        println(line.length + " " + line)
        val newCnt = cnt + 1
        return (newCnt)
      }
    }   
    

至于副作用,我没想到 (line <-lines) 会如此具有破坏性!它完全展开线迭代器。因此,运行以下代码段将使 size = 0 :

val lines = Source.fromFile(args(0)).getLines()
var cnt = 0
for (line <- lines) {
  cnt = readLines(line, cnt)
}
val size = lines.size

像这样隐藏的副作用是正常的 Scala 实践吗?

4

3 回答 3

2

你可以这样弃牌lines

val lines = Source.fromFile(args(0)).getLines()
val cnt = lines.foldLeft(0) { case (count, line) => readLines(line, count) }
Console.err.println("cnt = "+cnt)

您的readLines方法对调用有副作用println,但使用foldLeft保证从左到右处理列表,因此输出应该是相同的。

于 2013-03-19T14:04:07.887 回答
1

为什么我不能使用“<-”运算符重新分配具有函数返回值的不可变“cnt”变量?

你为什么要?如果您有 java 经验,<- 的含义:for(Item x: someCollection). 它只是从集合中获取当前项目并为其命名的语法糖,它通常不是绑定运算符。

此外,不是重新分配不可变的 矛盾修饰法吗?

如何以函数方式增加不可变变量(类似于 Haskell <-)?

人们通常使用 Scala .zipWithIndex,但这仅在您要在内部使用 counter 进行理解时才有效:

for((x, i) <- lines.zipWithIndex) { println("the counter value is" + i) } 

所以我认为你需要坚持lines.count或使用折叠/减少或=variable 分配新值。

于 2013-03-19T14:03:25.177 回答
0

<-不是运算符,只是用于表达式的语法。你必须使用=. 如果要使用<-它必须在 for-iteration-expression 内。而且你不能增加 a val。如果要修改该变量,请将其设为var.

于 2013-03-19T14:03:31.370 回答