
ok Elis i tried again, first ,as i am familiar with λ expressions i can use both do syntactic sugar or the other form with λ. so itried you code,surpringly it compiles but when i launch it the function can not print somethin on screen, i assume it is because function are pure in haskell, nor with putStrln or Debug.trace: getBD_WDS :: Connection -> String -> IO Float getBD_WDS conn name = do let qry_head = "select DNUM from WDS where DISC = ?" :: Query bd_rows <- query conn qry_head (Only name) let lg = Prelude.length bd_rows -- putStrLn (if lg > 1 then "some" else "one or zero") let tst = trace (if lg > 1 then "some" else "one or zero") (if lg > 1 then "some" else "one or zero") -- let noBDtxt :: Text let noBDtxt = fromOnly (Prelude.head bd_rows) -- noBDstr :: String let noBDstr = Text.unpack noBDtxt -- noBDfp :: Float let noBDfp = read noBDstr return noBDfp in fact due to lazy evaluation i'm not sure it compiles all the code because a more simple example give compilation errors: getLstBD_WDS :: Connection -> String -> IO Int getLstBD_WDS conn name = do let qry_head = "select DNUM from WDS where DISC = ?" :: Query bd_rows <- query conn qry_head (Only name) let lg = Prelude.length bd_rows return lg Prelude> :load UpdateSidonie [1 of 1] Compiling Main ( UpdateSidonie.hs, interpreted ) UpdateSidonie.hs:123:14: error: • Ambiguous type variable ‘r0’ arising from a use of ‘query’ prevents the constraint ‘(QueryResults r0)’ from being solved. Probable fix: use a type annotation to specify what ‘r0’ should be. These potential instances exist: instance Result a => QueryResults (Only a) -- Defined in ‘Database.MySQL.Simple.QueryResults’ instance (Result a, Result b) => QueryResults (a, b) -- Defined in ‘Database.MySQL.Simple.QueryResults’ instance (Result a, Result b, Result c) => QueryResults (a, b, c) -- Defined in ‘Database.MySQL.Simple.QueryResults’ ...plus 21 others (use -fprint-potential-instances to see them all) • In a stmt of a 'do' block: bd_rows <- query conn qry_head (Only name) In the expression: do let qry_head = ... bd_rows <- query conn qry_head (Only name) let lg = Prelude.length bd_rows return lg In an equation for ‘getLstBD_WDS’: getLstBD_WDS conn name = do let qry_head = ... bd_rows <- query conn qry_head (Only name) let lg = ... .... | 123 | bd_rows <- query conn qry_head (Only name) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Failed, no modules loaded. Le 14/12/2018 12:45, Tom Ellis a écrit :
On Fri, Dec 14, 2018 at 11:22:38AM +0000, Tom Ellis wrote:
On Fri, Dec 14, 2018 at 11:49:45AM +0100, Damien Mattei wrote:
another question with Haskell, again with my database but that is again related to Monads:
Damien, it's very hard to read your posts because they consist of snippets of code interspersed with commentary. You'll probably get much better responses if you post single, very small, well-formatted examples of sample code.
Anyway, the ultimate answer to your query is "use do-notation". Your getBS_WDS would be clearer written something like:
And ultimately I think you wanted to do something with lg and tst:
``` getBD_WDS :: Connection -> String -> IO Float getBD_WDS conn name = do let qry_head = "select DNUM from WDS where DISC = ?" :: Query
bd_rows <- query conn qry_head (Only name)
let lg = Prelude.length bd_rows
putStrLn (if lg > 1 then "some" else "one or zero")
let noBDtxt :: Text noBDtxt = fromOnly (Prelude.head bd_rows)
noBDstr :: String noBDstr = Text.unpack noBDtxt
noBDfp :: Float noBDfp = read noBDstr
return noBDfp ```
_______________________________________________ Haskell-Cafe mailing list To (un)subscribe, modify options or view archives go to: http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe Only members subscribed via the mailman list are allowed to post.
-- Damien.Mattei@unice.fr, Damien.Mattei@oca.eu, UNS / OCA / CNRS