2

我以下階高階函數工作的工會:斯卡拉:高階函數返回的套

def after(M: Set[Expression], n: String): Set[Set[Expression]] = { M.map((expr: Expression) => aft(expr,n)) } 

功能後具有以下特徵:

def aft(m: Expression, n: String): Set[Expression] 

類型Expression是我創建的一個抽象類。

我想要的方法after採取的Expression個組M,M中的每個元件上施加aft然後返回結果的並集(即Set[Expression]而非Set[Set[Expression]])。我認爲在這種情況下應該使用更高階的函數,但我不能真正理解如何去做,因爲我仍然認爲自己是Scala和函數式編程中的新手。

回答

4

您正在尋找的flatMap代替map:任何用戶定義的類型表現爲有望與Set[A]

def after(M: Set[Expression], n: String): Set[Expression] = { M.flatMap((expr: Expression) => aft(expr,n)) } 

一般情況下,一個需要確保hashCodeequals被正確執行,否則之間的平等兩個對象將使用Object.equals,這通常不是你想要的。

作爲一個方面說明,雖然這是一個可愛的方法,它不是一個更高階的函數。它不會將函數作爲參數,也不會返回函數。

+0

我嘗試過,但因爲我正在使用自己的Expression類,所以無法工作。有沒有辦法實現我自己的平面圖? – wirdis

+0

@wirdis你不需要你自己的'flatMap',你需要在'Expression'上實現'hashCode'和'equals',或者它繼承了'Set'的兒童以正常工作。 –

+1

謝謝,它工作! – wirdis