2012-03-02 56 views
3

以下是我對語言的理解。如何在Scala中聲明新的部分函數類型

如何聲明新的特定部分函數類型。比方說,我需要聲明許多部分定義的函數,取一個MyClass類並返回一個字符串。如果我嘗試:

class mypf extends PartialFunction[MyClass, String] 
val myinstance: mypf = { case ... } 

斯卡拉抱怨mypf應該是抽象的。我會怎麼做?完全這樣做不是個好主意嗎?如果是這樣,爲什麼?

回答

8

雖然一般不會解決你的問題,它可以幫助在特定情況下:

scala> type mypf = PartialFunction[Int, String] 
defined type alias mypf 

// type alias for PartialFunction 

scala> val x: mypf = {case x: Int if x > 10 => "More than ten"} 
x: mypf = <function1> 
+1

謝謝。我忽略了「類型」關鍵字這就是問題所在。 – eje211 2012-03-02 17:32:16

6

如果你想要的是僅僅有PartialFuncion [MyClass的,字符串]的別名,你應該做的

type MyPf = PartialFunction[MyClass, String] 

該聲明不可能在頂層,它必須在一個對象內。如果你想讓它看起來非常像頂層聲明,那麼你可以在包對象中聲明類型。

要走遠一點,做

abstract class mypf extends PartialFunction[MyClass, String] 

是合法的(它顯然必須是抽象的,它缺乏對應用的實施和被定義)。但是,諸如{case x => ...}之類的表達式將屬於PartialFunction類型,而不是您的類型,因此您的類型將不方便。

即使沒有丟失litterals,使用繼承只是爲了得到一個別名是有限的使用。如果您執行class MyClass extends Something<With, Lots, Of, Parameters>,則MyClass將在您創建實例時提供幫助,但是聲明MyClass類型的方法參數可防止過度限制該方法。

2

A PartialFunction不必爲整個輸入域定義,因此該特徵將applyisDefinedAt定義爲抽象。 因此,你必須實現上述方法,像這樣:

val myInstance = new PartialFunction[Int, String] { 
    override def apply(i: Int): String = { 
    if (i < 100) 
     "Valid " + i 
    else 
     "Undefined" 
    } 

    override def isDefinedAt(i: Int): Boolean = i < 100 
} 

你不需要說override明確,但它有時是非常有用這樣做。