Почему haskell останавливается при попытке добавить строку в конец этой строки? - PullRequest
4 голосов
/ 15 апреля 2019

Я пытаюсь добавить строку в конец строки в Haskell.

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

Всякий раз, когда я запускаю это, он просто застревает на " в консоли, и я должен прекратить его.

Почему? и как мне добавить строку в другую строку таким образом?

Edit: Как добавить несколько строк в конец текущей строки, не перезаписывая ее.

Спасибо

Ответы [ 3 ]

9 голосов
/ 15 апреля 2019

В отличие от ML, Haskell не имеет ключевого слова rec для пометки рекурсивных определений.Вместо этого все определения могут быть рекурсивными, что означает, что в каждом определении переменной определенная переменная уже находится в области действия во время ее определения.

Таким образом, в let albumStr = albumStr ++ "nothing" albumStr справа от = относитсяк определенному слева от =, а не к определенному в строке 1. Поэтому определение бесконечно рекурсивно и зацикливается навсегда.

Если вы хотите определить переменную на основе другой, выдолжен дать ему другое имя:

let localAlbumStr = albumStr ++ "nothing"
6 голосов
/ 15 апреля 2019

Уравнение

albumStr = albumStr ++ "nothing"

определяет строку рекурсивно и вообще не использует глобально определенный albumStr.Рекурсия сразу же зависает (это похоже на бесконечный цикл).

Включение предупреждений сообщает о затенении глобального имени.

Если вы не хотите рекурсивное определение, используйте другое имя переменной:

albumStr2 = albumStr ++ "nothing"
3 голосов
/ 15 апреля 2019

В нотации do вы можете написать

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

, и она (кажется) будет работать.

В то время как let (и функция) привязки в Haskell являются рекурсивными,do привязок нет.

Вместо этого автоматически создается теневая переменная, которая фактически является новой переменной с тем же именем.Код справа от <- находится в области видимости выше привязки;код слева от <- находится в новой, более широкой области (включая предыдущую).

См. также:

...