我是一名初级 Scala 开发人员,在 Paul Chiusano 所著的“Scala 中的函数式编程”一书中进行的编码练习 (5.12) 中遇到了问题。
我在这里有这个函数,称为expand,它需要一个初始状态和一个函数,用于生成具有下一个状态的流:
def unfold[A,S](z: S)(f: S => Option[(A,S)]): Stream[A] = f(z) match {
case Some((h,t)) => h #:: unfold(t)(f)
case _ => Stream.empty
}
Run Code Online (Sandbox Code Playgroud)
例如,使用这个函数可以创建一个无限的对象流,例如
def constant[A](a: A): Stream[A] = unfold(a)(_ => Some(a,a))
现在,我想创建斐波那契数列,然后输入:
def fibs: Stream[Int] = unfold((0,1))((a,b) => Some(a,(b,a+b)))
我收到这些错误:
缺少参数类型 b
Some[((Int,Int),(Nothing,String))] 类型的表达式不符合预期类型 Option[(A_,(Int,Int))]
如果我在传递给expand的匿名函数中使用case关键字,例如:
{ case (a,b) => Some(a,(b,a+b))}
一切安好。
所以我的问题是:这两种实现有什么区别?这是我不明白的类型推断吗?
functional-programming scala type-inference anonymous-function pattern-matching
scala ×1