Я новичок в Haskell и наткнулся на довольно неприятную неровность на дороге. На моем текущем этапе я просто пытаюсь передать списки из моей основной функции в другую и просто ПЕЧАТЬ, и я не понимаю, почему это не сработает.
В голове у меня такое чувство, что я просто должен уметь:
main = do
putStrLn "-----Text Editor-----"
putStrLn "Please enter your text"
leftString <- getLine
putStrLn $ "\n\n" ++ leftString ++ "|"
moveCursorLeft = do
putStr $ leftString
но это, похоже, не работает, поскольку 'leftString' не входит в область видимости.
Языки, в которых это используется может (например, Lisp и оболочка), используют область видимости динамичный, а не более распространенную область видимости статический или лексический.
Вызов функций - это рукопожатие между вызывающим и вызываемым: вызывающий должен передать некоторые аргументы, а вызываемый должен их принять. Как вы написали, moveCursorLeft
не принимает никаких аргументов. Но не волнуйтесь, это легко исправить:
moveCursorLeft leftString = do
putStr $ leftString
Теперь вы можете использовать это в main
, например.
main = do
leftString <- getLine
putStr "\n\n"
moveCursorLeft leftString
putStrLn "|"
moveCursorLeft должен вызываться пользователем для перемещения курсора по тексту, который был введен в leftString, например. «А, Б, В, Г» | «E, F, G» => moveCursorLeft => «A, B, C» | "D, E, F, G"
Это похоже на другой вопрос. Неправильно изменять или расширять вопросы с помощью комментариев.
@BasicBooties: вы хотели бы отделить свою модель данных от способа печати и логику вашей программы (например, перемещение курсора) от логики печати, например moveCursorLeft ("ABCD", "EF")
~> ("ABC", "DEF")
. И затем выведите курсор, printCursor ("ABC", "DEF")
~> печатьA, B, C | D, E, F
.
Очень немногие языки должны это делать. Когда вы перейдете к написанию более сложных программ, вы поймете, почему это полезно.