2016-02-10 60 views
-2

我想學習Haskell,但它有點困難,因爲我的綁定非命令從命令行記住;從我的終端下面輸出。GHCI Haskell不記得在命令行中的綁定

> let b = [] 
> b 
[] 
> 1:b 
[1] 
> b 
[] 

我不知道爲什麼這是這樣的,任何人都可以請幫忙。

回答

5

你期望你的例子做什麼?從你提出的內容來看,我沒有看到任何令人驚訝的事情。


當然,這個答案可能令你感到驚訝,或者你不會問。我會老實說:我可以猜你想要什麼。如果我是對的,你認爲輸出將是:

> 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。因此,你說「b1之後是b」;因爲我們知道b是什麼,我們可以替代並得到「b是一個列表,它是1其次是1其次是b」,等等永遠。或:b = 1 : b,所以代入b我們得到b = 1 : 1 : b,而代之以我們得到b = 1 : 1 : 1 : 1 : …

(即哈斯克爾產生無限的名單,而不是進入一個無限循環的事實,是因爲Haskell是非嚴格,更普遍地被稱爲 - 這是可能是一個最大的Haskell和在那裏每一個主流語言之間的差異。欲瞭解更多信息,搜索「懶惰的評價」在谷歌或堆棧溢出。)


所以,到最後,我希望你能明白爲什麼我沒」令人驚訝的是:Haskell不可能更新變量綁定。所以既然你的定義是let b = [],那當然最後的結果還是[] :-)

+0

這真的很有幫助,我非常感謝你。這很難開始,像我這樣的人真的很喜歡回到基本的東西這樣的東西,我試着研究答案,但是當你根本不瞭解任何東西時,文檔很難遵循。 – something