小编enr*_*is8的帖子

Scala匿名函数中的模式匹配

我是一名初级 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

3
推荐指数
1
解决办法
2328
查看次数