簡體   English   中英

為什么在嘗試將字符串添加到此字符串末尾時haskell會停止?

[英]Why does haskell stop when trying to add a string to the end of this string?

我試圖在Haskell中的字符串末尾添加一個字符串。

    albumStr = ""
main = do
 let albumStr = albumStr ++ "nothing"
 print albumStr

每當我運行它,它只是卡在控制台中,我必須終止它。

為什么? 以及如何以這種方式將字符串添加到另一個字符串?

編輯:如何在不覆蓋當前字符串的末尾添加多個字符串。

謝謝

與ML不同,Haskell沒有用於標記遞歸定義的rec關鍵字。 相反,所有定義都可以是遞歸的,這意味着在每個變量定義中,定義的變量在定義期間已經在范圍內。

所以在let albumStr = albumStr ++ "nothing"albumStr下, =右邊的albumStr指的是=左邊定義的那個 - 而不是第一行中定義的那個。因此定義是無限遞歸的並且永遠循環。

如果要根據另一個變量定義變量,則必須為其指定一個不同的名稱:

let localAlbumStr = albumStr ++ "nothing"

等式

albumStr = albumStr ++ "nothing"

以遞歸方式定義字符串,並且根本不使用全局定義的albumStr 遞歸立即掛起(類似於無限循環)。

打開警告會報告全局名稱的陰影。

如果您不想要遞歸定義,請使用另一個變量名稱:

albumStr2 = albumStr ++ "nothing"

do記號,你可以寫

do { albumStr <- pure (albumStr ++ "nothing") 
   ; ... 
   } 

它會(似乎)起作用。

雖然Haskell中的let (和函數)綁定是遞歸的, do綁定卻不是。

而是自動創建一個陰影變量,它實際上是一個具有相同名稱的新變量。 <-右邊的代碼位於綁定上方的范圍內; <-左邊的代碼在一個新的,更廣泛的范圍內(包括前面的代碼)。

也可以看看:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM