繁体   English   中英

Scala折叠功能不匹配类型

[英]Scala Fold Function Mismatch type

我有一个如下的FoldSignal案例类。

/**
 * 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应该返回U (请参阅f: (U, T) => U ),它是List[T]但是您返回U.head._1 ,它是Any (由于解决了您的存在类型_


您会看到您所看到的,因为Scala在这里无法推断类型(对于Nil )(类型推断看不到fstart参数之间的连接),请尝试:

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

另一种方法是将f分开并start进入不同的参数列表( start应在第一位-因此首先要从中推断出T ):

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

可能与类型推理有关(与Haskell比较) ,并作了一些解释1 :: foldLeft中的List [Nothing]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM