我正在创建一个简单的Haskell待办事项列表,我想调用一个函数"提示"递归地显示基于用户输入的不同菜单选项。问题是,在初始调用时,提示应该期望接收一个函数作为不期望任何参数本身的参数之一。以下任何调用"提示"可能需要调用一个函数,该函数期望传递给正在传递给函数的函数的参数。
这是我的代码:
mainMenuOptions :: IO ()
mainMenuOptions = do
putStrLn ""
putStrLn "What would you like to do?"
putStrLn ""
putStrLn "OPTIONS"
putStrLn ""
putStrLn "'+' : add items | '-' : remove items"
subMenuOptions :: [String] -> String -> IO ()
subMenuOptions todos operation = do
putStrLn ""
if operation == "add"
then do putStrLn ("Type in the TASK you'd like to " ++ operation ++ ", then hit ENTER")
addListItemOptions todos
else do
putStrLn ("Type in the NUMBER of the task you'd like to " ++ operation ++ ", then hit ENTER")
putStrLn "('r' : return to the main menu)"
prompt :: [String] -> IO () -> IO ()
prompt todos showOptions = do
showTasks todos
showOptions
input <- getLine
interpret input todos
interpret :: String -> [String] -> IO ()
interpret input todos
| input == "r" = prompt todos mainMenuOptions
| input == "+" = prompt todos subMenuOptions "add"
| input == "-" = prompt todos subMenuOptions "remove"
| otherwise = do
putStrLn ""
putStrLn "SORRY, did not get that! Please enter a valid option."
prompt todos mainMenuOptions
main :: IO ()
main = do
putStrLn "Haskell ToDo List"
prompt [] mainMenuOptions
我尝试这样做时得到的错误是:
无法匹配预期类型'[Char] - &gt; IO()' 实际类型'IO()' •函数'prompt'应用于三个参数, 但它的类型'[String] - &gt; IO() - &gt; IO()'只有两个
答案 0 :(得分:5)
在这一行
| input == "+" = prompt todos subMenuOptions "add"
首先,prompt
只接受2个参数,我们将它传递给3个,就像错误所说的那样。对于prompt
的第二个参数,我们希望使用IO ()
subMenuOptions
传递给subMenuOptions :: [String] -> String -> IO ()
IO ()
表示如果我们给它一个字符串列表和一个字符串,它将为我们提供我们正在寻找的| input == "+" = prompt todos (subMenuOptions todos "add")
。所以:
prompt todos subMenuOptions todos "add"
我们需要括号,因为
prompt
意味着我们将4个参数传递给Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkState(ZLjava/lang/String;Ljava/lang/Object;)V
at com.google.firebase.FirebaseApp.checkNotDeleted(FirebaseApp.java:317)
at com.google.firebase.FirebaseApp.getOptions(FirebaseApp.java:263)
at com.google.firebase.database.FirebaseDatabase.getInstance(FirebaseDatabase.java:75)
。