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
感觉我现在永远不会完全掌握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