我想學習Haskell,但它有點困難,因爲我的綁定非命令從命令行記住;從我的終端下面輸出。GHCI Haskell不記得在命令行中的綁定
> let b = []
> b
[]
> 1:b
[1]
> b
[]
我不知道爲什麼這是這樣的,任何人都可以請幫忙。
我想學習Haskell,但它有點困難,因爲我的綁定非命令從命令行記住;從我的終端下面輸出。GHCI Haskell不記得在命令行中的綁定
> let b = []
> b
[]
> 1:b
[1]
> b
[]
我不知道爲什麼這是這樣的,任何人都可以請幫忙。
你期望你的例子做什麼?從你提出的內容來看,我沒有看到任何令人驚訝的事情。
當然,這個答案可能令你感到驚訝,或者你不會問。我會老實說:我可以猜你想要什麼。如果我是對的,你認爲輸出將是:
> let b = []
> b
[]
> 1:b
[1]
> b
[1]
對嗎?假設我是,那麼問題是:爲什麼不是?
那麼,簡短的版本是「這不是什麼(:)
做」。相反,(:)
從它的參數中創建一個新列表; x:xs
是一個新列表,其第一個元素是x
,其餘部分與xs
完全相同。但它創建了一個新的列表。這就像如何+
創建一個新的數字,是它的參數和:是的行爲
> let b = 0
> b
0
> 1+b
1
> b
0
奇怪,太? (但願不是!)
當然,這開闢了「好了,我怎麼更新b
,然後呢?」下一個問題。這就是Haskell展示其真實色彩的地方:你不需要。在Haskell中,一旦變量綁定到一個值,該值永遠不會改變;就好像所有變量和所有數據類型都是const
(類似於C語言或最新的Javascript標準)或val
(在Scala中)。
哈斯克爾這功能 - 它被稱爲是純功能 - 可能是Haskell和在那裏每一個主流語言之間的一個最大區別。當你不處於可變狀態時,你必須以一種完全不同的方式來編寫程序。
例如,去了一下更遠的地方,它很可能你會嘗試接下來的事情會是這樣的:
> let b = []
> b
[]
> let b = 1 : b
在這種情況下,你認爲什麼將被印刷當你輸入b
?
好吧,請記住,變量不會改變!所以答案是:
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,…
永遠 - 或者直到你命中控制-C並中止。
這是因爲let b = 1 : b
定義了一個新的變量名爲b
;你可能寫了let c = 1 : c
。因此,你說「b
是1
之後是b
」;因爲我們知道b
是什麼,我們可以替代並得到「b
是一個列表,它是1
其次是1
其次是b
」,等等永遠。或:b = 1 : b
,所以代入b
我們得到b = 1 : 1 : b
,而代之以我們得到b = 1 : 1 : 1 : 1 : …
。
(即哈斯克爾產生無限的名單,而不是進入一個無限循環的事實,是因爲Haskell是非嚴格,更普遍地被稱爲懶 - 這是也可能是一個最大的Haskell和在那裏每一個主流語言之間的差異。欲瞭解更多信息,搜索「懶惰的評價」在谷歌或堆棧溢出。)
所以,到最後,我希望你能明白爲什麼我沒」令人驚訝的是:Haskell不可能更新變量綁定。所以既然你的定義是let b = []
,那當然最後的結果還是[]
:-)
這真的很有幫助,我非常感謝你。這很難開始,像我這樣的人真的很喜歡回到基本的東西這樣的東西,我試着研究答案,但是當你根本不瞭解任何東西時,文檔很難遵循。 – something