簡體   English   中英

帶有函數參數的Scala案例類

[英]Scala case class with function parameters

我正在使用這段代碼:

case class State[S, +A](run: S => (A, S)) {
  ...                                          
  def flatMap[B](f: A => State[S, B]): State[S, B] = State(s => {    
    val (a, s1) = run(s)
    f(a).run(s1)
  })
  ...                                        
}

這是一個用於處理純函數狀態的抽象,來自Scala中FP的 §6。 run是一個函數參數,它接受一個狀態並發出一個值元組和一個新狀態。

我的問題是圍繞本節中的語法s =>

... B] = State(s => { ...

這似乎是使用State '構造函數'(即apply )來構建一個新的State對象。 但是s代表什么? 它是一個'匿名'狀態,代表任何國家實例嗎? 如果是這樣,它與this有何不同? 或者s對應於run的輸入參數,即S from:

... (run: S => ....  

為什么我會使用構造函數進行函數定義? 請注意,flatMap定義的最后一個符號是a )而不是} ,即關閉State apply構造函數。

此方案與標准略有不同

case class Person(name: String)

情景,所以我想我會問......

你的第二個假設是正確的, s對應於run函數的輸入參數,即S ,它表示通過鏈的實際狀態。 所以s => {...}只是類型S => (A, S)的lambda定義。 Scala中的Lambda和函數是一等公民 (值),因此您可以將它們作為參數傳遞給另一種類型(包括一些monad)。

這里產生新原始狀態S (和新結果A )的函數被包裝(參見返回操作)到monad狀態,monad狀態實現為case類。 我們需要它來定義monad上的flatMap操作(參見bind )。

為了使傳遞函數更清楚地作為參數,可以將代碼重寫為:

case class State[S, +A](run: S => (A, S)) {
    def flatMap[B](f: A => State[S, B]): State[S, B] = {
        def newState(s: S) = {    
           val (a, s1) = run(s)
           f(a).run(s1)
        }
        State(newState _)
    }
}

所以,根據monad的定義

  • State[S, +A]是一個類型構造函數,它接受兩個普通類型( S和協變A )並返回monadic類型State
  • State.apply(run: S => (A, S))函數接受一個普通函數並返回(提升)monadic容器State ,因此它是monad的“return”運算符
  • State.flatMap[B](f: A => State[S, B]): State[S, B]對應“綁定”運算符

Case類僅用於具有顯式“返回”功能( apply )而不是使用new運算符。

暫無
暫無

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

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