【问题标题】:How to write the following Scala code without vars如何在没有 var 的情况下编写以下 Scala 代码
【发布时间】:2021-02-03 12:09:10
【问题描述】:

下面是一个简单的sn-p代码,它定义了一个表示链表的Node类和一个将节点添加到链表末尾的方法。在代码中,有两个变量。如何在没有任何变量的情况下编写此代码?

case class Node[A](data: A, var next: Option[Node[A]])
def addNodeToEnd[A](node: Node[A], nodeToAdd: Node[A]): Node[A] = {
    if (node.next == None) {
        node.next = Some(nodeToAdd)
    } else {
        var current = node
        while ( current.next != None) {
           current = current.next.getOrElse(current)
        }
        current.next = Some(nodeToAdd)      
    }
    node
}

//Test                              
val node = Node(1, Some(Node(2, Some(Node(3, None)))))
val nodeToAdd = Node(88, None)

println(addNodeToEnd(node, nodeToAdd))

【问题讨论】:

  • 好吧,删除方法中的vars 没有多大意义(因为本地突变被认为是性能和可读性没问题),因为数据结构本身是可变的(因为全局可变性是不变性试图解决的真正问题)。 - 但无论如何,只需使用递归,而不是 while,只需调用 addNodeToEnd(node.next, nodeToAdd)
  • 如果你还想从 Node 类中删除var,你基本上是在重新创建一个 List,我可以给你代码它会附加到列表,但您可以在互联网上找到该代码,这是一个非常标准的练习。如果你想学习 Scala 尤其是像不变性这样的 FP 概念,最好自己解决这个问题,诀窍是 recursion,然后 tail-recursion。但是,如果你自己一个人完成这个过程会很困难,我建议你学习一些逐步涵盖所有概念的课程或书籍。
  • 只是想看看人们可能采用的各种方法。
  • 正如我所说的 recursiontail-recursionhere 你可以看到这两个例子。
  • 谢谢!

标签: scala functional-programming


【解决方案1】:

这是一种方法。没有vars。没有突变。

case class Node[A](data: A, next: Option[Node[A]])

def addToEnd[A](node: Node[A], toAdd: A): Node[A] =
  node.next.fold(node.copy(next = Some(Node(toAdd,None))))(
            n => node.copy(next = Some(addToEnd(n,toAdd))))

//Test                              
val list = Node(1, Some(Node(2, Some(Node(3, None)))))
addToEnd(list, 88)
//res0: Node[Int] = Node(1,Some(Node(2,Some(Node(3,Some(Node(88,None)))))))

或者,如果您愿意...

def nodeAppend[A](ns: Node[A], toAppnd: Node[A]): Node[A] =
  ns.next.fold(ns.copy(next = Some(toAppnd)))(
        nxt => ns.copy(next = Some(nodeAppend(nxt, toAppnd))))
//Test                              
val list = Node(1, Some(Node(2, None)))
val listToAdd = Node(88, Some(Node(99,None)))

nodeAppend(list, listToAdd)
//res0: Node[Int] = Node(1,Some(Node(2,Some(Node(88,Some(Node(99,None)))))))

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-17
  • 2021-12-02
相关资源
最近更新 更多