2017-04-07 70 views
0
val list1 = List(1, 1, 2, 3, 5,7,8,4) 
    def lastrecursive[A](ls :List[A]):A = ls match{ 
    case p :: Nil => p // what is the meaning of Nil 
    case _ :: tail => lastrecursive(tail) 
    case _ => throw new NoSuchElementException 
    } 

对于ABOVE递归格式的代码。任何人都可以解释我们为什么给 ::和案件h和案件尾部和案件_。同时处理列表匹配模式。scala中匹配模式中case的含义是什么?

and for reversing a list 
    def reverseRecursive[A](ls: List[A]): List[A] = ls match { 
    case Nil  => Nil 
    case h :: tail => reverseRecursive(tail) ::: List(h) 
      } 

how this ::: List(h)works?

回答

2

::方法用于构造和解构列表。 a :: b表示列表的头部是(单个元素),尾部是b(列表)。

p :: Nil表示存在某个元素p且尾部为空列表(Nil)的情况。

这种情况基本上找到列表中的最后一个实际元素。

第二种情况类似:h :: tail表示元素h和列表尾。因此,我们反转尾部,然后将h列表添加到结尾(l1 ::: l2预先将列表 l1加到列表 l)。

+2

那么......我相信在这种情况下,使用单词'method'而不是'operator'是一个更好的选择。 '::'不用于构造或解构列表。它实际上是一个'将'元素预加载到'列表'的正确联想方法。当你看到'p :: Nil'时,那么'Nil'是'p'前置的空列表。 –

+1

@SarveshKumarSingh。你是对的 - 更新。 –

+0

“操作符”是一个非常标准的词,具有非常标准的含义。它不是“非字母数字名称的方法名称”。我会建议你在谈论Scala时避免使用“operator”这个词。 –

相关问题