【问题标题】:Scala Fold Function Mismatch typeScala 折叠函数不匹配类型
【发布时间】:2015-09-23 02:27:50
【问题描述】:

我有一个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)
                 ^

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

【问题讨论】:

  • 函数foldFun的错误信息是Expression of type FoldSignal[T, Any] doesn't conform to expected type Signal[T]

标签: scala scaffolding folding


【解决方案1】:

你的(_, DateTime) 的类型搞砸了——你的foldFun 应该返回U(参见f: (U, T) => U),即List[T],但你返回U.head._1,即Any(结果解决你的存在类型_)


您会看到您所看到的,因为 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

【讨论】:

  • 这无济于事,但谢谢。顺便说一句,您的 def makeFoldSignal... 应该是案例类而不是函数吗?
  • 1) 你可能用你的 (_, DateTime) 弄乱了类型 - 你的 foldFun 应该返回 U (f: (U, T) => U) 这是 List[T] 但你返回 U.head._1 2)我在这里使用工厂是因为你不能有两个参数列表的案例类(至少第二个不会自动变成val,也不会有copy等)
  • 你说得对,我真的打错字了。我想我应该考虑重构我的 FoldSignal 函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-27
  • 2016-01-29
  • 2015-01-17
  • 1970-01-01
相关资源
最近更新 更多