繁体   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