Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当类型为A(Scala)时,设置什么作为默认值_Scala_Design Patterns_Pattern Matching_Matching_Tail Recursion - Fatal编程技术网

当类型为A(Scala)时,设置什么作为默认值

当类型为A(Scala)时,设置什么作为默认值,scala,design-patterns,pattern-matching,matching,tail-recursion,Scala,Design Patterns,Pattern Matching,Matching,Tail Recursion,我在Scala中做了一个练习,我必须将这种列表(a,a,a,b,c,d,d,e,a,a)转换为 ((a,3)、(b,1)、(c,1)、(d,2)、(e,1)、(a,2))。 我显然知道我的算法还不正确,但我想从任何事情开始。 问题是,我不知道如何打开函数(最后一行),因为错误是,无论我取什么作为“previous”参数,它都会说required:A,find:Int/String等。 上一次迭代的目的是作为上一次迭代的负责人 def compress[A](l: List[A]): List[(

我在Scala中做了一个练习,我必须将这种列表(a,a,a,b,c,d,d,e,a,a)转换为 ((a,3)、(b,1)、(c,1)、(d,2)、(e,1)、(a,2))。 我显然知道我的算法还不正确,但我想从任何事情开始。 问题是,我不知道如何打开函数(最后一行),因为错误是,无论我取什么作为“previous”参数,它都会说required:A,find:Int/String等。 上一次迭代的目的是作为上一次迭代的负责人

def compress[A](l: List[A]): List[(A, Int)] = {
  def compressHelper(l: List[A], acc: List[(A, Int)], previous: A, counter: Int): List[(A, Int)] = {
    l match {
      case head::tail => {
        if (head == previous) {
          compressHelper(tail, acc :+ (head, counter+1), head, counter+1)
        }
        else {
          compressHelper(tail, acc :+ (head, counter), head, 1)
        }
      }
      case Nil => acc
    }
  }
  compressHelper(l, List(), , 1)
}

您不需要显式地传递
previous
,只需查看累加器:

def compress[A](l: List[A], acc: List[(A, Int)]=Nil): List[(A, Int)] =
   (l, acc) match {
       case (Nil, _) => acc.reverse
       case (head :: tail, (a, n) :: rest) if a == head =>
            compress(tail, (a, n+1) :: rest)
       case (head :: tail, _) => compress (tail, (head, 1) :: acc)
}

不能这样做,特别是因为您不会总是有上一个元素,所以请改用
选项[a]
。类型不匹配。Required:List[(A,Int)],find:Iterable[(A,Int)]我在尝试编译时遇到这种错误。这是关于acc.reversedok,我的错,这只是关于acc.reverse,而不是reversed:)谢谢。我有一个问题-你用(a,n)::rest,因为这个列表就像那个列表((a,b))。例如,如果我有一个类似列表((a,b,c,d),(e,f,g,h))的列表,我必须写(a,b,c,d)::rest而不是head::tail?因此,使用head::tail仅适用于列表中有单个元素时的情况?@squall
head::tail
将列表解构为第一个元素和其余元素。如果列表中包含元组,那么
head
的值将最终成为元组(比如
(a、b、c、d)
或其他)。如果您不关心元组的单个元素,只需要整个元组,那么仍然可以执行
head::tail
。或者你可以进一步解构它,比如
(a,uu,c,u)::tail
。您可以根据需要嵌套这些不匹配的内容<代码>案例(一些((a,b,c))::::。(x::y::z::,):::tail=>…