如何将参数发送到scala中的匿名函数,我试图将其从方案中转换为
(cdr (map (lambda (x) (* x x)) somelist )
我知道cdr只是.tail
并且匿名函数类似于(x: Int) => x * 2, 9
任何帮助表示感谢。
答案 0 :(得分:4)
你必须在这里进行两种翻译:
从前缀表示法(函数在参数之前)到中缀/后缀表示法(对象和参数之间的方法)。
从功能(功能和数据没有紧密绑定)到面向对象(方法绑定到对象)。
我将在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)