
for now i'm here: getBD :: Connection -> String -> Float getBD conn name = noBDfp where qry_head = "select `N° BD` from sidonie.Coordonnées where Nom = ?" :: Query -- bd_rows = -- do -- local_bd_rows <- query conn qry_head (Only (name::String)) -- return local_bd_rows bd_rows :: IO [Only Text] bd_rows = query conn qry_head (Only (name::String)) noBDtxt :: [Text] noBDtxt = fromOnly (Prelude.head bd_rows) noBDstr :: String noBDstr = Text.unpack noBDtxt :: String noBDfp = read $ noBDstr :: Float but it fails due to the IO : Prelude> :load UpdateSidonie [1 of 1] Compiling Main ( UpdateSidonie.hs, interpreted ) UpdateSidonie.hs:53:42: error: • Couldn't match expected type ‘[Only [Text]]’ with actual type ‘IO [Only Text]’ • In the first argument of ‘Prelude.head’, namely ‘bd_rows’ In the first argument of ‘fromOnly’, namely ‘(Prelude.head bd_rows)’ In the expression: fromOnly (Prelude.head bd_rows) | 53 | noBDtxt = fromOnly (Prelude.head bd_rows) | ^^^^^^^ UpdateSidonie.hs:55:31: error: • Couldn't match expected type ‘Text’ with actual type ‘[Text]’ • In the first argument of ‘unpack’, namely ‘noBDtxt’ In the expression: unpack noBDtxt :: String In an equation for ‘noBDstr’: noBDstr = unpack noBDtxt :: String | 55 | noBDstr = Text.unpack noBDtxt :: String | ^^^^^^^ Failed, no modules loaded. Le 10/12/2018 17:19, Seph Shewell Brockway a écrit :
Hi Damien,
On Mon, Dec 10, 2018 at 03:18:48PM +0100, Damien Mattei wrote:
have some code that works but want to put it in a simple function without sucess:
getBD :: Connection -> String -> Float getBD conn name = noBDfp where qry_head = "select `N° BD` from sidonie.Coordonnées where Nom = ?" :: Query bd_rows = do local_bd_rows <- query conn qry_head (Only (name::String)) return local_bd_rows
i want the variable local_bd_rows accessible in the 'where' clause
how can i do that?
You don’t seem to be using the function bd_rows anywhere in the main body of the definition. You would need to do something like
getBD :: Connection -> String -> IO Float getBD = do rows <- bd_rows {- code that does something with the returned data -}
Note the change to the type signature—querying the database is an IO action, and therefore takes place in the IO monad.
Incidently, your use of do notation in the definition of bd_rows is unnecessary:
do x <- doSomething return x
is actually syntactic sugar for
doSomething >>= \x -> return x
which the monad laws state is equivalent to just doSomething. This is a common misapprehension among Haskell novices: the do notation is just a syntactic convenience, and it is perfectly possible to write monadic functions, including in the IO monad, without it.
Hope at least some of this helps.
Seph
-- Damien.Mattei@unice.fr, Damien.Mattei@oca.eu, UNS / OCA / CNRS