[英]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.