我是Haskell的新手,所以如果這個問題很愚蠢,請原諒。
想象一下,我們有兩個系結到名稱x和y的資料結構。
x是可變的。
不是。
作為一個問題或原則,x是否一定具有與y不同的型別?
uj5u.com熱心網友回復:
沒有可變變數這樣的東西,所以這個問題不會出現。也許您可以更具體地了解您想象的場景。使用快捷方式“可變變數”并沒有傳達您想要傳達的任何內容。
uj5u.com熱心網友回復:
簡短的回答:是的。
在 Haskell 中,所有變數在技術上都是不可變的。不像在 JavaScript 中,一旦你在 Haskell 中定義了一個新變數并將它系結到一個初始值:
let x = expression1 in body1
這就是它永遠的價值。x在 中使用的任何地方body1,其值都保證是 的(固定)值expression1。x(好吧,從技術上講,您可以在 in 中定義一個具有相同名稱的全新不可變變數,body1然后xbody 中的一些 s 可能會參考該新變數,但這是完全不同的事情。)
Haskell 確實有可變資料結構。我們通過創建一個新的可變結構并將其系結到一個不可變變數來使用它們:
do ...
xref <- newIORef (15 :: Int)
...
在這里,xref 它本身的值不是整數 15。相反,xref它被分配了一個不可變的、不可顯示的值,用于標識當前內容為 15 的“容器”。要使用這個容器,我們需要顯式地從中提取值,我們可以分配給不可變變數:
value_of_x_right_now <- readIORef xref
并明確地將值放入其中:
writeIORef xref (value_of_x_right_now 15)
關于這些值,以及通常需要通過 inIO或其他 monad 中的 monadic 操作訪問它們的方式,顯然還有更多可以說的內容。
但是,即使拋開這一點,也應該清楚整數15和“內容初始化為整數的容器15”是具有必然不同型別的物件。在這種情況下,型別是Int和IORef Int分別。
所以,資料結構的可變性必然會在型別層面體現出來,因為 Haskell 中的可變性是通過這些“容器”實作的,值的型別與值的型別不同。包含該值的容器。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/434059.html
