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