【问题标题】:'let...in' expression in ScalaScala 中的'let...in' 表达式
【发布时间】:2014-01-01 08:40:55
【问题描述】:

在 OCaml 中,let...in 表达式允许您在表达式而不是语句中创建命名局部变量。 (是的,我知道从技术上讲,一切都是一个表达式,但 Unit 返回值相当无用。)这是 OCaml 中的一个简单示例:

let square_the_sum a b = (* function definition *)
    let sum = a + b in (* declare a named local called sum *)
        sum * sum (* return the value of this expression *)

这就是我想要等效的 Scala 的样子:

def squareTheSum(a: Int, b: Int): Int =
    let sum: Int = a + b in
        sum * sum

Scala 中有什么东西可以用来实现这一点吗?

【问题讨论】:

    标签: scala


    【解决方案1】:

    编辑:

    你每天都会学到新东西,这里是answered before

    object ForwardPipeContainer {
      implicit class ForwardPipe[A](val value: A) extends AnyVal {
        def |>[B](f: A => B): B = f(value)
      }
    }
    
    import ForwardPipeContainer._
    
    def squareTheSum(a: Int, b: Int): Int = { a + b } |> { sum => sum * sum }
    

    但我想说这几乎没有那么容易阅读,也没有那么灵活(嵌套的 let 会变得很尴尬)。


    您可以将valdef 嵌套在def 中。没有特殊的语法;你不需要let

    def squareTheSum(a: Int, b: Int): Int = {
      val sum = a + b
      sum * sum
    }
    

    我认为这里的可读性没有任何不同。但是,如果您只想在表达式中创建变量,您仍然可以使用花括号来执行此操作,如下所示:

    val a = 2                                       //> a  : Int = 2
    val b = 3                                       //> b  : Int = 3
    val squareSum = { val sum = a + b; sum * sum }  //> squareSum  : Int = 25
    

    分号和单词“in”之间没有显着区别(或者您可以将表达式移到下一行,并假装“in”是隐含的,如果它使它更像 OCaml :D)。

    val squareSum = {
      val sum = a + b // in
        sum * sum
    }
    

    另一个更具技术性的内容是:Clojure's 'let' equivalent in Scala。我认为与多语句形式相比,生成的结构相当迟钝。

    【讨论】:

    • 这就是我目前正在这样做的方式,而且它显然是 100% 正确的。我只是想知道是否有办法只使用表达式(我真的很喜欢 OCaml 中 let 表达式的可读性)。
    • @GJK 如果您将 val 视为 let 关键字,是的,有一种方法(没有什么能阻止您将函数分配给 val:val plusOne = (x: Int) => x + 1
    • 我真的很好奇我是否可以只使用表达式来编写 Scala 代码(所以没有 val 或返回 Unit 的“语句”)。我不想这样编程,我只是有点好奇。 (好吧,你明白了。我对 Lisp 很着迷。)
    • 我明白了。我认为这是一个功能纯度问题而不是可读性,因为很难说“in”形式实际上更具可读性或更清晰(或更少;它只是不同)。但这并不会使它无效。如果没有实际的语言支持(一个新关键字),我不相信你能做到这一点。我不相信你能写出这样工作的in 后缀运算符。
    • 也就是说……如果我要进一步探索,我可能会研究宏、宏注释和准引号。您可以做很多事情(尤其是在 2.11 中)以有趣的方式调整 Scala。我在那里没有完整的答案;但这是我开始研究如何制作let…in 构造的地方。
    猜你喜欢
    • 2013-08-27
    • 2018-06-24
    • 2019-10-14
    • 2019-01-29
    • 2015-07-26
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多