Scala lambda表达式

Scala lambda表达式,scala,Scala,(看起来我问的基本问题太多了,但Scala非常难,尤其是在语言特性或语法方面,我来自Java背景。) 我正在看这段视频:YouTube上的Scalaz State Monad。讲师编写了以下代码: trait State[S, +A] { def run(initial: S):(S, A) def map[B](f: A=>B): State[S, B] = State { s => val (s1, a) = run(s) (s1, f(a

(看起来我问的基本问题太多了,但Scala非常难,尤其是在语言特性或语法方面,我来自Java背景。)

我正在看这段视频:YouTube上的Scalaz State Monad。讲师编写了以下代码:

trait State[S, +A] {
  def run(initial: S):(S, A)
  def map[B](f: A=>B): State[S, B] =
    State { s =>
      val (s1, a) = run(s)
      (s1, f(a))
}
他说第四行的
状态
是一个“lambda”表达式(我可能听错了)。我对此有点困惑。他确实有一个对象
状态
,如下所示:

Object State {
  def apply[S, A](f: S=>(S, A)): State[S, A] =
    new State[S, A] {
      def run(i: S) = f(i)
    }
}
讲师说他是通过这样调用调用对象状态的
apply
方法的,是的,他传入了一个返回正确元组的函数,但是那是什么
{s=>
?他从哪里得到
s
,这是关于Scala中的隐式机制吗

另外,在
map
函数中传递的函数已经将A更改为B,它如何仍然能够通过泛型检查(从[S,A]到[S,B],假设A和B是两种不同的类型,或者它们是相同的类型?如果为真,为什么在
map
函数中使用
B
而不是
A

视频链接在这里,设置为18:17


谢谢(对于不太熟悉函数式编程的人来说,Monad有点让人望而生畏)

您走的路是对的

他将函数作为参数传递,但函数通常是什么?函数接受参数并返回值。这里返回的值是tuple
(s1,f(a))
,但我们还需要引用函数参数。
s
在您的示例中是函数参数

def map[B](f: A=>B): State[S, B] = {
    def buildState(s: S) = {
      val (s1, a) = run(s)
      (s1, f(a))         
    }  
    State(buildState)
}

但是,由于我们在其他任何地方都不需要这个函数,我们只需将它内联到
apply
call中。

The
{s=>…}
是Scala中的一个lambda表达式。虽然它一开始令人困惑,但很简单。我不理解有关泛型检查的问题。@som snytt我编辑了这部分内容。我似乎对泛型不太了解。我恭敬地建议您发现Scala非常困难,部分原因是您正在查看您不熟悉的东西因为Scala比Java强大得多,你会发现一些非常深奥的东西,但这并不意味着你需要知道范畴理论才能在Scala中做你知道如何在Java中做的事情。你可能会最好把scalaz放在一边至少六个月,也许一年。到那时,这些小的详细信息不会给您带来任何麻烦,您将准备好调查scalaz和其他远远超出Java能力范围的软件包。@AmigoNico您可能是对的。整个Monad和其他函数式编程模式似乎很奇怪。我稍后将试着理解它们。谢谢:)嗯..那么程序如何找到这个
s
?唯一的方法是在
map
中传递的ng是一个函数。@windlineder,检查
State
对象的
apply
方法的用法。调用
apply
并传递函数。
apply
创建
State
trait的实例,其中
run
方法调用传递的函数。简而言之,它返回新的
State
object,当您在其上调用
run
时,它会调用您的函数。希望您得到它:)