0

我努力實現「簡單」行爲:將模式匹配代碼分成兩個獨立的函數。模式匹配:使用PartialFunction分割代碼?

我簡化了清晰的目的模型:

abstract class Animal 
case object Dog extends Animal 
case object Cat extends Animal 
case object Bird extends Animal 
case object Bat extends Animal 
case object Dolphin extends Animal 

我想對這些功能的不同模式匹配(因爲實際的代碼是很長),但也有其他參數,以便PartialFunctions是給我有病......
在一個完美的世界,我可以這樣寫:

type PF = PartialFunction[(Animal, Int, String), String] 
private def processFlying(a: Animal, n: Int, loc: String): PF = { 
    a match { 
    case Bird => n + " birds found in " + loc 
    case Bat => n + " bats found in " + underground(loc) 
    } 
} 
private def processMarine(a: Animal, n: Int, loc: String): PF = { 
    a match { 
    case Dolphin => n + " dolphins found in " + submarine(loc) 
    } 
} 
private def processPet(a: Animal, n: Int, loc: String): PF = { 
    a match { 
    case Dog => n + " dogs found in " + loc 
    case Cat => n + " cats found in " + loc 
    } 
} 
def processAnimal(a: Animal, number: Int, location: String) = { 
    val processAll = processFlying orElse processMarine orElse processPet 
    processAll(a, n, location) 
} 

但是不起作用。主要是因爲我需要在我的函數中有幾個參數。 「爲什麼你不使用元組?」你可以說?嗯,我嘗試和編譯器將不會停止抱怨預期的類型比實際的類型不同,不同的到我的別名:(

任何幫助,建議,或可替代的IDE將是有用的!
乾杯


編輯: 我跟着西里爾的答案BU我還需要在比賽前進行了一些工作,像這樣:

val processFlying: PF = { 
    // doSomething, like declare a sub-function f 
    { 
     case (b: Bird, n, loc) => f(b) 
     case (b: Bat, n, loc) => f(b) 
    } 
} 
+0

爲什麼你的子功能需要在'val'內?難道不可以,旁邊說一個'私人的def'嗎? –

+0

這就是我所做的,但我不需要它在其他地方,所以...... :) 此外,我想通過使用閉包來利用它。這是熱情,現在看起來事情很好。但如果任何人有解決方案,我會保持知道 –

回答

2

您的問題是,你混合方法定義和功能d efinition。

def processFlying(a: Animal, n: Int, loc: String): PF 

是一個方法的簽名,這三個參數,並返回一個PF,即PartialFunction[(Animal, Int, String), String](你周遭物體)。

因此,假設該簽名是你想要什麼,你將只能得到一個PartialFunction如果你已經有了一個Animal,一個IntString ...

你更有可能想要的是定義一個PF值(無參數),所以更類似

val processFlying: PF = { 
    case (Bird, n, loc) => ... 
    case (Bat, n, loc) => ... 
} 

EDIT

要回答你的第二個請求(儘管它可能是矯枉過正,因爲定義你的助手作爲一個私人DEF將做的工作),就可以送花兒給人放在一個封閉的PF塊:

val processFlying = { 
    def f = ... 
    val res = { 
    case (Bird, n, loc) => f(...) 
    case (Bat, n, loc) => f(...) 
    } 
    res 
} 

但是,你必須將值賦給PartialFunction定義塊,否則解析器將無法知道如何處理它。這只是因爲PartialFunction定義與case s塊和關閉共享{}語法。

+0

你給我很好的線索。我開始弄清楚這是如何工作的。 但是,我有一個特例(當然):在我的一個函數中,我需要在「匹配之前」插入代碼。我不知道如何在評論中插入代碼,所以我編輯了我的第一條消息。 –