【问题标题】:Is there a way I can write this Haskell code in Scala?有没有办法可以在 Scala 中编写这个 Haskell 代码?
【发布时间】:2013-06-08 02:57:24
【问题描述】:

我正在学习一些函数式编程语言,学习感兴趣的东西,我现在正在研究 Scala。我想做的是找出最简单的方法来编写一个名为double 的函数,该函数接受一个参数并将其加倍。到目前为止,我想出的是:

def double = (x:Int) => x*2

def double(x:Int) = x*2

这可行,但我正在寻找最简单的方法。在 Haskell 中,我可以简单地这样做:

double = (*2)

因为它是一个部分应用的函数,所以不需要命名变量或指定任何类型(我确信 * 函数会处理这些)。有没有类似的方法可以使用 Scala 做到这一点?我尝试了一些,尤其是使用_ 而不是x,但似乎都没有。

【问题讨论】:

    标签: scala haskell partial-application


    【解决方案1】:

    这个怎么样:

    val double = (_: Int) * 2
    

    注意这里doubleFunction而不是method。在您的第一个示例中,您定义了一个名为doublemethod,返回类型为Function。在您的第二个示例中,您刚刚定义了一个methodFunction 与 Scala 中的 method 不同。

    如果编译器可以得到类型信息,我们可以写成Function 更简单:

    scala> def apply(n: Int, f: Int => Int) = f(n)
    apply: (n: Int, f: Int => Int)Int
    
    scala> apply(10, 2*)
    res1: Int = 20
    
    scala> apply(10, 100+)
    res2: Int = 110
    

    【讨论】:

    • "函数与 Scala 中的方法不同。"一个看似非常重要的事实,我却一无所知。感谢您清除它。
    • 哇。我从来不知道我们可以这样通过2*。谢谢。
    【解决方案2】:

    最短的写法是

    *2
    

    【讨论】:

    • 如何将其设置为 val?我试过val double = *2,但它不喜欢那样。
    • 不,你根本不写val double = ,只是在你需要的地方写* 2。意思相同,可以直接理解,避免与 java.lang.Double 等混淆。
    猜你喜欢
    • 2021-12-21
    • 2021-10-18
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    • 2020-08-22
    • 1970-01-01
    相关资源
    最近更新 更多