【发布时间】:2020-11-14 02:23:07
【问题描述】:
我正在尝试创建一个从文本文件中读取数据的菜单。但是我得到了三个错误,尽管在 IO() 开始时变量不在范围内。我没有正确阅读 txt.file,我创建菜单的方式是否错误?
错误
Variable not in scope: spaDatabase :: [Spa]
--line of error for spaDatabase
let updatedDB = (addSpa rid br ar (read st) spaDatabase)
Variable not in scope: spaDB
Variable not in scope: updatedDB :: [Spa]
--line of error for updatedDB
2 -> putStrLn (spaListStr updatedDB) >> menu spaDB
我的代码
main :: IO()
main = do
contents <- readFile "spa.txt"
let spaDatabase = (read contents :: [Spa])
menu spaDatabase
putStrLn ""
where menu spaDatabase = do
putStrLn "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
putStrLn "\nPlease select an option:"
putStrLn "1: Add a new spa to the database "
putStrLn "2: Show all spa "
putStr "\nSelected option: "
putStrLn ""
option <- getLine
putStrLn "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
output :: Int -> IO ()
output option = do
case option of 1 -> do putStrLn "Enter Spa ID: "
rid <- getLine
putStrLn "Enter Spa Brand Name: "
br <- getLine
putStrLn "Enter Spa Area: "
ar <- getLine
putStrLn "Enter Spa Stars: "
st <- getLine
let updatedDB = (addSpa rid br ar (read st) spaDatabase)
putStrLn (spaListStr updatedDB)
writeFile "spa.txt" (spaListStr updatedDB)
2 -> putStrLn (spaListStr updatedDB) >> menu spaDB
【问题讨论】:
-
在
main函数的位置定义了两个函数menu和output。这些函数不继承do块的范围。现在,由于output没有名为spaDatabase的参数并且范围内不存在更高的变量,因此您会收到错误消息。 -
我建议避免使用
do .. where。在do中绑定的变量在where中不可见。如果您只在do中使用let,则不会出现此问题。 -
谢谢你!虽然现在我有一个解析错误菜单 spaDatabase = do,是因为缩进吗?
-
编辑不应使现有答案无效。我滚了回去。如果您有新问题要使用新代码提出,欢迎您发布一个新问题,说明这是此问题的后续问题,包括您认为相关的链接。 :)
-
谢谢威尔!我设法清除了顶部错误,但它在第二选择时变成了解析错误。我会将这个链接添加到那个链接。
标签: variables haskell scope let do-notation