如何将带有参数的函数传递给Haskell中的另一个函数?

时间:2017-10-04 19:00:22

标签: haskell

我正在创建一个简单的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()'只有两个

1 个答案:

答案 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)