Перенос Хаскеля между монадическими функциями - PullRequest
0 голосов
/ 23 ноября 2018

Чувствую, что я никогда не пойму полностью Хаскелла.Две функции: одна, которая подсчитывает записи в SQlite DB, поэтому она может генерировать инкрементные идентификаторы (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 голосов
/ 23 ноября 2018

Во-первых, checkUniqueID возвращает Int, поэтому его тип должен быть IO Int, а не IO ():

checkUniqueID :: IO Int

Во-вторых, в нотации do, стрелка влево <- - это то, что связывает результат монадической функции с именем.Вы уже используете его с getLine, поэтому я не совсем уверен, почему вы не сможете использовать его и с checkUniqueID:

taskIDInt <- checkUniqueID
...