匿名函数的参数

时间:2010-11-10 03:11:18

标签: scala functional-programming

如何将参数发送到scala中的匿名函数,我试图将其从方案中转换为

(cdr (map (lambda (x) (* x x)) somelist ) 

我知道cdr只是.tail

并且匿名函数类似于(x: Int) => x * 2, 9

任何帮助表示感谢。

3 个答案:

答案 0 :(得分:4)

你必须在这里进行两种翻译:

  1. 从前缀表示法(函数在参数之前)到中缀/后缀表示法(对象和参数之间的方法)。

  2. 从功能(功能和数据没有紧密绑定)到面向对象(方法绑定到对象)。

  3. 我将在Scala中使用点符号,以使事情更清晰。

    所以,在Lisp中你有(function arguments),所以很容易识别每个函数的参数是什么。在Scala中你有object.method(parameters),所以让我们通过每个Lisp函数来确定什么是参数以及对象是什么。

    另一方面,一些Lisp函数会对它接收的每个参数执行一些操作,这不会转换为Scala方法的工作方式。在这些情况下,需要引入其他方法进行翻译,通常是序列的map

    <强> CDR

    正如您所提到的,这是Scala的tail。唉,tail是一种无参数方法,cdr也只接收一个参数,因此无需进一步转换。因此,

    (cdr (map (lambda (x) (* x x)) somelist))
    

    成为部分翻译

    (map (lambda (x) (* x x)) somelist ).tail
    

    <强> MAP

    给出的示例中缺少一个参数,即结果类型。所以我们假设那里有一个'list。这里的翻译比较棘手,因为Scala中的map是集合上的方法,而不是函数上的方法。因此somelist是对象,(lambda (x) (* x x))是方法的参数。

    然后,翻译来自部分翻译

    (map (lambda (x) (* x x)) somelist).tail
    

    仍然部分翻译

    somelist.map(lambda (x) (* x x)).tail
    

    <强> LAMBDA

    这个更棘手,因为Scala中没有与其等价的方法,并且没有,因为没有方法可以绑定变量。但是,lambda是语言的固有内容,语法如下:

    (argument list) => expression
    

    因此,

    (lambda (x) (* x x))
    

    将(部分)翻译成

    ((x) => (* x x))
    

    回到例子,我们有

    somelist.map(lambda (x) (* x x)).tail
    

    成为

    somelist.map((x) => (* x x)).tail
    

    但是,这里有两个要点。首先,Lisp是动态类型的,因此不需要声明x的类型。对于Scala而言,情况并非如此,因为所有数字都没有通用类型。

    第二点是,Scala具有类型推断,因此它可以从x的类型推断出somelist的类型,从而得出上述观点在这种特殊情况下,

    最后,

    <强> *

    这通常会更棘手,因为确实适用于您拥有的许多参数。

    的通常翻译
    (* arguments)
    

    collection.reduceLeft((x, y) => x * y)
    

    collection是某种包含所有arguments

    的集合

    但是,在这种情况下,正好有两个参数,因此可以将其转换为Scala自己的*。因此,对于翻译的最后部分,我们采取

    somelist.map((x) => (* x x)).tail
    

    并将其转换为

    somelist.map((x) => x * x).tail
    

    我希望在某个地方找到你怀疑的答案。

答案 1 :(得分:3)

我不太清楚问题是什么,所以这比其他任何事情都要引发更多的信息(或其他答案):

List(1,2,3) map (x => x * x) tail // => List(4,9)

这与:

相同
//blasted Scala still gets me -- List(1,2,3).map(x => x * x).tail()
List(1,2,3).map(x => x * x).tail

两种情况下x => x * x都是'lambda'。

上面的类型可以省略,因为可以推断出来。然而,

// need the type here because it can't be inferred from context
val square = (x: Int) => x * x

答案 2 :(得分:2)

我不确定你想要什么,我不知道计划,也许这个:

val a = (x:Int) => x * 2
List(1,2,3).map(a)
List(1,2,3).map(_ * 2)