鑑於這樣的:提取方法,以獨立的功能斯卡拉
class A {
def f(x: X) = ...
def g(y: Y, z: Z) = ...
...
}
如何(自動)提取功能(S):
object A {
val f' = (a: A, x: X) => a.f(x) // do this automagically for any arbitrary f
val g' = (a: A, y: Y, z: Z) => a.g(y, z) // and deal with arity > 1 too
...
}
有了這個確切類型簽名(第一對象,然後是參數列表)。讓我來說明這個問題很清楚:
。「鑑於一類
A
的上下文中定義的方法f(x1: X1, ..., xn: Xn)
,如何自動提取f'
是(I) 接收A
類型的實例a
功能和(ⅱ)對應1參數列表:1至f
參數列表,即x1: X, ... xn: Xn
,其實現是恰好a.f(x1: X1, ..., xn: Xn)
「
甚至:
捕獲的λ演算外延性,這樣 的概念,它可以自動提取
λx.(f x)
從f
每當x
不f
出現免費。
這可能首先找到一種方法訪問標識符f
,g
,......不具有特定a: A
來解決(一個將有一個特定的A
後,當然)。我們可以簡單地用手寫f'
或g'
,但讓我們放縱DRYness。
P.S.也許這是不可能的,沒有運行時反射(雖然它可以用Scala 2.10+宏),因爲我似乎無法事先找到指定f
或g
而沒有特定實例(a: A
)的標識符的方法。但它會像下面這樣,而不必訴諸strings
:
A.getMethod("f"): Function2[A, X, ...]
我也意識到了問題的是實際應用可以幫助學員提出的替代品,但我在抽象的意義上討論這個。我並沒有試圖解決我減少到這個問題的其他問題。我想知道如果這一個是可能的:-)這是一個very nice article真正理解這個問題背後的動機,與Scala上的Eta擴展咆哮。
使用反射這樣的目的,實在不是一個好主意。它將不可避免地變成過度複雜,它會降低性能,並且會破壞使用靜態語言的整個觀點,因爲所有的方法解析和調用都將在運行時完成。你應該真的考慮不同的方法來解決你的問題,比如使用implicits。可能用適當的信息擴展你的問題可能會幫助其他人幫助你。 –
@NikitaVolkov我同意你的意見。反思很糟糕。但如果在編譯時解決問題,那麼就沒有理由降低性能,也不會丟失類型安全性。 –
反射無法在編譯時解決,因爲它的全部內容是在運行時反省您的程序。從2.10開始,Scala中有一個宏特性,但是在編譯時能夠解決你的問題,這絕對是一種矯枉過正的現象。我不是這方面的專家,所以我無法幫助你。順便說一下,在目前的狀態下,你的問題非常廣泛,很可能會被封閉。很難得到你在這裏問的實際內容。 –