[英]parameter to anonymous function
您如何將參數發送到Scala中的匿名函數,我正在嘗試將其從Scheme轉換為
(cdr (map (lambda (x) (* x x)) somelist )
我知道cdr只是.tail
匿名函數就像(x: Int) => x * 2, 9
任何幫助表示贊賞。
您必須在此處進行兩種翻譯:
從前綴表示法(函數先於參數)到中綴/后綴表示法(對象與參數之間的方法)。
從功能(功能和數據未緊密綁定)到面向對象(方法已綁定到對象)。
我將在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) (* xx))
方法的參數。
然后,翻譯來自部分翻譯
(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具有類型推斷 ,因此可以從somelist
的類型推斷x
的類型,這使得上述點在這種特殊情況下 somelist
。
最后,
*
這通常會更棘手,因為它確實適用於您擁有的許多論點。 的通常翻譯
(* arguments)
是
collection.reduceLeft((x, y) => x * y)
其中collection
是包含所有arguments
某種collection。
但是,在這種情況下,恰好有兩個參數,因此可以將其轉換為Scala自己的*
。 因此,對於翻譯的最后部分,我們
somelist.map((x) => (* x x)).tail
然后變成
somelist.map((x) => x * x).tail
我希望一路走來,可以解決您的疑問。
我不太確定問題是什么,所以這是引發更多信息(或其他答案)的原因:
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
我不確定您要什么,我不知道計划,也許這是一個:
val a = (x:Int) => x * 2
List(1,2,3).map(a)
List(1,2,3).map(_ * 2)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.