【发布时间】:2017-04-01 03:09:08
【问题描述】:
我是一名 Scala 初学者,在 Paul Chiusano 的《Scala 中的函数式编程》一书中的编码练习 (5.12) 中遇到问题。
我在这里有这个函数,叫做 unfold,它接受一个初始状态和一个用于生成具有下一个状态的流的函数:
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
}
例如,使用此功能可以创建无限的对象流,例如
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))]
李>
如果我在传递给 unfold 的匿名函数中使用 case 关键字,例如:
{ case (a,b) => Some(a,(b,a+b))}
一切都很好。
所以我的问题是:这两种实现有什么区别?是不是我不明白的类型推断?
【问题讨论】:
标签: scala functional-programming pattern-matching anonymous-function type-inference