簡體   English   中英

Scala中的部分函數

[英]Partial Functions in Scala

我只是想澄清一下Scala中部分定義的函數。 我查看了文檔,它說部分函數的類型是PartialFunction[A,B] ,我可以定義一個部分函數,​​如

val f: PartialFunction[Any, Int] = {...}

我想知道,對於類型ABA是一個參數, 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
}

當然,請確保將參數作為元組傳遞給它。

除了其他答案,如果通過“多個接受的類型”表示您希望相同的函數接受例如StringIntBoolean (並且沒有其他類型),這稱為“聯合類型”,目前Scala不支持(但計划在未來,基於Dotty )。 替代方案是:

  1. 使用最不常見的超類型(以上情況為Any )。 這就是orElse連鎖店將要做的事情。
  2. 使用類似Either[String, Either[Int, Boolean]] 如果你有兩種類型,這很好,但很快變得難看。
  3. 將聯合類型編碼為交集類型的否定

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM