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._1
是 Any
(作为解决你的存在类型 _
的结果)
你看到你看到的,因为 Scala 不能在这里推断类型(对于 Nil
)(类型推断看不到 f
和 start
参数之间的联系),尝试:
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 :: List[Nothing] in foldLeft
我有一个 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._1
是 Any
(作为解决你的存在类型 _
的结果)
你看到你看到的,因为 Scala 不能在这里推断类型(对于 Nil
)(类型推断看不到 f
和 start
参数之间的联系),尝试:
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 :: List[Nothing] in foldLeft