【问题标题】:What is this syntax called? And where is it explained in the Scala documentation?这种语法叫什么? Scala 文档在哪里解释了它?
【发布时间】:2016-01-22 13:13:38
【问题描述】:

在 Spray 上通过 tutorial 时,我遇到了这个:

entity(as[Quiz]) { quiz => requestContext =>
        val responder = createResponder(requestContext)
        createQuiz(quiz) match {
        case true => responder ! QuizCreated
        case _ => responder ! QuizAlreadyExists
    }
}

这一行是混乱所在:

entity(as[Quiz]) { quiz => requestContext =>

第二个=>符号是什么鬼??? 这个语法是什么意思,我在哪里可以找到进一步阅读的文档??

【问题讨论】:

    标签: scala higher-order-functions


    【解决方案1】:

    如果我这样放括号,是否更有意义?

    entity(as[Quiz]) { quiz => (requestContext =>
          ...  
          )
        }
    }
    

    这只是一个带有两个参数的柯里化函数,从机制上讲,它是一个返回另一个函数的函数。示例:

    val test: Int => Int => Int = a => b => a + b // the same as a => (b => a + b)
    println(test(2)(3))  //5
    

    您可以将其视为(a, b) => a + b,但还有额外的好处,因此您可以更轻松地部分应用它:

    val t: Int => Int = test(2)
    println(t(3)) // 5
    

    【讨论】:

    • 你能链接文档吗?我已经准备好接受这个作为正确答案了
    • 我真的不确定它是否在这种语法中得到了准确的解释,但如果您阅读了普通(非匿名)curried 函数,这应该很明显:docs.scala-lang.org/tutorials/tour/currying.html 然后只需将 lambda 语法应用于此原理:docs.scala-lang.org/tutorials/tour/…
    • 其他确保这一点的方法是从第一个链接中编写一个 curried 命名函数:REPL 中的def modN(n: Int)(m: Int) = ((x % n) == 0),然后打印它的类型::t modN _。这将导致Int => (Int => Boolean)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    • 2011-04-12
    • 2020-03-08
    • 1970-01-01
    • 2017-09-09
    • 1970-01-01
    相关资源
    最近更新 更多