【问题标题】:print list functional using scala使用scala打印列表功能
【发布时间】:2012-09-15 07:08:29
【问题描述】:

我有一个问题:我在 scala 中有一个这样的列表 (List("Entry1", "Entry2", "Entry3")) 我想打印这个列表功能。所以我不想使用任何类型的循环。

我知道可以使用某种代码:

def test(input:List[_])
input match
{
case //and what now?
case _ => //recursion I guess?

}

我想用这个方法打印这个列表,每个元素都换行。

有人可以帮帮我吗?

谢谢!

【问题讨论】:

    标签: list scala printing recursion functional-programming


    【解决方案1】:

    标准方法是:

    val xs = List("Entry1", "Entry2", "Entry3")
    xs.foreach(println)
    

    或者,如果你想要它的索引:

    xs.zipWithIndex.foreach { case (x,i) => println(i + ": " + x) }
    

    但我从您的问题中了解到,这是编写递归函数的练习,因此了解内置方法并不能真正帮助您。

    所以,如果你想自己递归地做,没有内置的foreach 方法,试试这个:

    @tailrec
    def printList[T](list: List[T]) {
      list match {
        case head :: tail =>
          println(head)
          printList(tail)
        case Nil =>
      }
    }
    
    printList(List("Entry1", "Entry2", "Entry3"))
    

    更新:关于您对列表索引的评论,试试这个:

    def printList[T](list: List[T]) {
      @tailrec
      def inner(list: List[T], i: Int) {
        list match {
          case head :: tail =>
            println(i + ": " + head)
            inner(tail, i + 1)
          case Nil =>
        }
      }
      inner(list, 0)
    }
    

    【讨论】:

    • 你定义的方式,当列表为Nil时会失败
    • 可以加Nil函数吗?
    • printList[T](我说的是T)是什么意思?
    • T 是一个泛型类型参数。这只是意味着该函数接受任何东西的List,并将其称为T。如果您想了解更多信息,请搜索“scala generics”。
    • 好的,是否也可以获取列表项编号(如 list(0) 但在功能循环中)?
    【解决方案2】:

    使用列表 API 的另一种解决方案:

    List("Entry1", "Entry2", "Entry3").zipWithIndex.foreach(t => println(t._2 + ":" + t._1))
    

    【讨论】:

    • @user1545846 foreach 不是循环。这是一个高阶函数。这绝对比在这里使用递归好 1000000%。无论如何,您都不应该期望 I/O 操作是“功能性的”——它本质上是有副作用的。
    【解决方案3】:

    List("LALA", "PEPE", "JOJO").map(println)

    【讨论】:

    • 您应该使用foreach,而不是map,因为map 将不必要地构造一个新的List,其中不包含Unit 实例。
    猜你喜欢
    • 2020-11-22
    • 2017-01-25
    • 1970-01-01
    • 2021-09-18
    • 2021-06-24
    • 2020-07-25
    • 2019-09-08
    • 2017-03-12
    • 1970-01-01
    相关资源
    最近更新 更多