为什么在尝试将字符串添加到该字符串末尾时haskell停止?

Dea*_*ean 4 string haskell infinite-loop accumulate left-recursion

我试图在Haskell的字符串末尾添加一个字符串。

    albumStr = ""
main = do
 let albumStr = albumStr ++ "nothing"
 print albumStr
Run Code Online (Sandbox Code Playgroud)

每当我运行它时,它只会卡在控制台中,而我必须终止它。

为什么?以及如何以这种方式将一个字符串添加到另一个字符串?

编辑:如何将多个字符串添加到当前字符串的末尾而不会覆盖它。

谢谢

sep*_*p2k 9

与ML不同,Haskell没有rec关键字来标记递归定义。取而代之的是,所有定义都可以是递归的,这意味着在每个变量定义中,定义的变量在其定义期间已经在范围内。

因此let albumStr = albumStr ++ "nothing",在中albumStr,的右侧是=指在左侧=定义的一个-而不是在第1行中定义的一个。因此,该定义是无限递归的,并且永远循环。

如果要基于另一个变量定义变量,则必须给它改一个不同的名称:

let localAlbumStr = albumStr ++ "nothing"
Run Code Online (Sandbox Code Playgroud)


chi*_*chi 6

等式

albumStr = albumStr ++ "nothing"
Run Code Online (Sandbox Code Playgroud)

递归定义一个字符串,并且根本不使用全局定义的字符串albumStr。递归立即挂起(类似于无限循环)。

打开警告会报告全局名称的阴影。

如果您不希望使用递归定义,请使用另一个变量名:

albumStr2 = albumStr ++ "nothing"
Run Code Online (Sandbox Code Playgroud)