单函数之间的Haskell转移

时间:2018-11-23 16:00:51

标签: sqlite haskell io monads

感觉我现在永远不会完全掌握Haskell。有两个功能:一个在SQlite DB中对记录进行计数,因此它可以产生增量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 ()

1 个答案:

答案 0 :(得分:2)

首先,checkUniqueID返回一个Int,因此其类型应为IO Int,而不是IO ()

checkUniqueID :: IO Int

第二,在do表示法中,左箭头<-是将单子函数的结果绑定到名称的函数。您已经在getLine中使用了它,所以我不完全确定为什么您也无法在checkUniqueID中使用它:

taskIDInt <- checkUniqueID