在 Scala 中稱為 inc 的以下函式中,它執行增量操作。
def inc(more:Int) = {
def helper(x:Int) = x more
helper _
}
無論何時呼叫 inc 函式,它都會回傳另一個系結傳遞給它的引數的函式。例如, inc(1) 將回傳另一個 Int => Int 型別的函式,其中變數 more 與 1 系結。
inc(1) // This is of type Int => Int
那么我們可以說 more 是回傳函式的狀態變數,當我們呼叫 inc(1) 時,1 被分配給 more 嗎?
這里有更多的闡述,
由于我來自 OO 編程范式,當我說狀態時,我將它與類的實體相關聯,在給定的時間具有特定的狀態。讓我們首先考慮 Java 中呼叫 IncHelper 的類,如下所示:
class IncHelper{
private int more;
public IncHelper(int more){
this.more = more;
}
public int inc(int x){
return x this.more;
}
}
如果我創建上述類的不同實體,如下所示:
IncHelper inc1 = new IncHelper(1);
// This instance will always increase a value by 1
inc1.inc(10); // output will be 11
如果我創建上述類的不同實體,如下所示:
IncHelper inc2 = new IncHelper(2);
// This instance will always increase a value by 2
inc2.inc(10); // output will be 12
所以在上面的兩個場景中,兩個實體 inc1 和 inc2 包含兩個不同的狀態變數值。我為 Scala 函式式編程給出的例子也是如此:
val inc1 = inc(1)
inc1(10) // Will return 11
如果我創建另一個值如下:
val inc2 = inc(2)
inc2(10) // Will return 12
所以在這兩種情況下,即 OO 編程,當我創建 2 個 IncHelper 實體時,它會記住在構造它時傳遞的變數。同樣,對于我們創建的兩個函式字面量也是如此,其中創建函式字面量 inc1 和 inc2 時傳遞的兩個變數存盤了值。
uj5u.com熱心網友回復:
函式的閉包存盤有關背景關系的資訊——這個背景關系是否由可變和/或不可變資料組成是另一回事。
只有在其中存在一些可觀察到的可變狀態時,我們才會將函式稱為有狀態的(使函式在參考上不透明;諸如列印之類的副作用被視為可變狀態)。因此,除非您有一些可能發生變異的資料(var從不發生變異的 s 使它們有效不可變),否則根據通常的術語,您的函式沒有狀態。
在你的情況下:
def inc(more:Int) = {
def helper(x:Int) = x more
helper _
}
inc不存盤可變資料。x more回傳一個新值,既不改變x也不改變more值。如果你這樣做:
inc(1)
inc(1)
inc(1)
inc(1)
你每次都會得到相同的結果(Int => Int具有相同行為的函式),沒有副作用。所以根據通常接受的術語,inc函式是無狀態的,你不能說它有狀態。內部存盤了一些資料的事實是無關緊要的,因為您撰寫的每段代碼都是這樣做的,因此一切都將被稱為有狀態,并且有狀態和無狀態之間的區別實際上是無用的。
現在,如果您將函式定義為:
var state = 0
def inc(more:Int) = {
state = state more
val y = state // binds current value of state
def helper(x:Int) = x y
helper _
}
每次inc使用相同的值呼叫都會產生不同的值(這里:Int => Int具有不同行為的函式),所以會有一些狀態要討論。(int函式將有一個狀態 - 存盤在 中var state,而回傳的函式將是無狀態的,因為它們只會捕獲不可變的值)。
該狀態問題將獨立于閉包的概念 - 閉包僅“說明”該函式的定義使用了在創建時提供的一些資料,并且該函式仍然可以在您無法從外部訪問該資料后訪問該資料。
總而言之,我只會說(一個特定的)“函式的閉包將一個狀態保存到一個函式中”,如果在該函式創建的環境中存在一些由該函式捕獲(使用)的可變狀態。在其他情況下,我不會這么說,因為沒有要捕獲的“狀態”。然而,由于這是非常不精確的陳述(函式是否捕獲了自身不可變的可變狀態的快照?或者函式是否捕獲了對某些可以在其外部發生變異的可變資料的參考?)我會完全避免它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/372699.html
