Scala lambda表达式
(看起来我问的基本问题太多了,但Scala非常难,尤其是在语言特性或语法方面,我来自Java背景。) 我正在看这段视频:YouTube上的Scalaz State Monad。讲师编写了以下代码: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
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
时,它会调用您的函数。希望您得到它:)