Scala 折叠函数不匹配类型

Scala Fold Function Mismatch type

我有一个 FoldSignal 案例 class 如下。

/**
 * Represents a signal that is manipulated to using the functional "fold" operation
 * @param s Underlying signal
 * @param start seed for the fold
 * @param f fold function
 */
 case class FoldSignal[T, U](s: Signal[T], start: U, f: (U, T) => U) extends Signal[U]

我用它在 Signal[T] 中创建了一个函数:

sealed trait Signal[T]{
 ...

/**
 * Return a delta of signals in windows
 */
 def delta(implicit ev: T =:= (_, DateTime) ): Signal[T] = {
   def foldFun(queue: List[T], t: T) = {
     println(queue(0))
     queue(0)._1
   }
   FoldSignal(this, Nil, foldFun)
 }
 ...
}

其中 Signal[T] 是密封特征:

/**
 * Signal is a AST object represents a value that is continuously emitted. It does
 * not specify anything about the source of the signal.
 */
sealed trait Signal[T] {...}

然后出现错误:

Error:(71, 22) type mismatch;
 found   : scala.collection.immutable.Nil.type
 required: T
    FoldSignal(this, Nil, foldFun)
                 ^

有人可以帮助我吗?谢谢!

您的 (_, DateTime) 搞乱了类型 - 您的 foldFun 应该 return U(参见 f: (U, T) => U),即 List[T] 但你 return U.head._1Any (作为解决你的存在类型 _ 的结果)


你看到你看到的,因为 Scala 不能在这里推断类型(对于 Nil)(类型推断看不到 fstart 参数之间的联系),尝试:

 FoldSignal(this, List.empty[T], foldFun)

另一种方法是将 fstart 分成不同的参数列表(start 应该是第一个 - 所以 T 将首先从中推断出来) :

def makeFoldSignal[T, U](s: Signal[T], f: (U, T) => U)(start: U)

可能与类型推断有关并稍微解释一下(与Haskell相比):1 :: List[Nothing] in foldLeft