簡體   English   中英

匿名函數的參數

[英]parameter to anonymous function

您如何將參數發送到Scala中的匿名函數,我正在嘗試將其從Scheme轉換為

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

我知道cdr只是.tail

匿名函數就像(x: Int) => x * 2, 9

任何幫助表示贊賞。

您必須在此處進行兩種翻譯:

  1. 從前綴表示法(函數先於參數)到中綴/后綴表示法(對象與參數之間的方法)。

  2. 從功能(功能和數據未緊密綁定)到面向對象(方法已綁定到對象)。

我將在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM