[英]Partial Functions in Scala
我只是想澄清一下Scala中部分定義的函數。 我查看了文檔,它說部分函數的類型是PartialFunction[A,B]
,我可以定義一個部分函數,如
val f: PartialFunction[Any, Int] = {...}
我想知道,對於類型A
和B
, A
是一個參數, B
是一個返回類型? 如果我有多個接受的類型,我是否使用orElse
將部分函數鏈接在一起?
在函數的集合理論視圖中,如果函數可以將域中的每個值映射到該范圍中的值,則我們說該函數是一個total function
。 可能存在這樣的情況:函數無法將域中的某些元素映射到該范圍; 這些功能稱為partial functions
。
以Scala文檔中的部分函數為例:
val isEven: PartialFunction[Int, String] = {
case x if x % 2 == 0 => x+" is even"
}
這里定義了部分函數,因為它被定義為僅將偶數整數映射到字符串。 因此,partial函數的輸入是一個整數,輸出是一個字符串。
val isOdd: PartialFunction[Int, String] = {
case x if x % 2 == 1 => x+" is odd"
}
isOdd
是另一個部分函數,類似於isEven
但是對於奇數。 同樣,partial函數的輸入是一個整數,輸出是一個字符串。
如果您有一個數字列表,例如:
List(1,2,3,4,5)
並在此列表中應用isEven
部分函數,您將獲得輸出
List(2 is even, 4 is even)
請注意,並非原始列表中的所有元素都已由partial函數映射。 但是,在某些情況下,您可能希望在部分函數無法將元素從域映射到范圍的情況下應用其他函數。 在這種情況下,我們使用orElse
:
val numbers = sample map (isEven orElse isOdd)
現在你將獲得輸出:
List(1 is odd, 2 is even, 3 is odd, 4 is even, 5 is odd)
如果您要設置一個實際上需要多個參數的部分函數,請在您要輸入的參數元組上定義部分函數,例如:
val multiArgPartial: PartialFunction[(String, Long, Foo), Int] = {
case ("OK", _, Foo("bar", _)) => 0 // Use underscore to accept any value for a given parameter
}
當然,請確保將參數作為元組傳遞給它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.