Haskell 单子函数之间的传递

Haskell transfer between monadic functions

感觉我现在永远不会完全掌握Haskell。两个函数:一个计算 SQlite 数据库中的记录,因此它可以生成增量 ID (checkUniqueID)。另一个做记录,拜访checkUniqueID。我只需要 taskEntry 的值作为 Int。我想我缺少留在单子领域的知识。下面的代码。

-- checkUniqueID :: IO ()
checkUniqueID = do
  conn <- open "taglist.db"
  len <- query_ conn "SELECT (id) FROM task" :: IO [Only Int]
  let showLength = Data.List.length $ len
  close conn
  return (showLength + 1) -- for testing purposes

-- fieldnames: id, task, date_in, date_out
taskEntry :: IO ()
taskEntry = do
      putStrLn "Provide task and date due: "
      let taskIDInt = checkUniqueID -- issue here!
      task <- getLine
      date_out <- getLine
      let date_in = "today"
      conn <- open "taglist.db"
      execute conn "INSERT INTO task (id, task, date_in, date_out) VALUES (?,?,?,?)"
            (taskIDInt :: Int , task :: String , date_in :: String , date_out :: String)
      close conn
      return ()

首先,checkUniqueID returns一个Int,所以它的类型应该是IO Int,而不是IO ():

checkUniqueID :: IO Int

其次,在 do 表示法中,左箭头 <- 是将 monadic 函数的结果绑定到名称的东西。您已经将它与 getLine 一起使用,所以我不完全确定为什么您不能将它与 checkUniqueID 一起使用:

taskIDInt <- checkUniqueID