[英]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.