[Haskell-cafe] trace output statements

Ian Denhardt ian at zenhack.net
Tue Dec 25 22:16:39 UTC 2018


(Adding the list back to Cc; you forgot to hit reply all)

Quoting Damien Mattei (2018-12-25 16:57:04)

> i get in trouble understanding what fmap was doing,

fmap (for IO) just applies a function to the result of the action, so:

    fmap f action

is equivalent to:

    do
        result <- action
        return (f result)

> and why the same thing to do in main and in a function had so
> different implementations...

I suspect the modified version of the program has some differences that
aren't strictly necessary just to factor out the relevant bits into
their own definition; this *shouldn't* be major surgery. Hard for me to
point out without having the two full examples handy.

Quoting Damien Mattei (2018-12-25 16:57:04)
>    yes, i understand with your python example, it's like read on a web
>    page, IO are not a "cake" but IO are "a recipe for the cake"...
>    functions are pure in haskell, so they can not have side effects...
>    what put me some trouble is an answer 2 weeks ago, someone gave me
>    hints that lead to this solution for getDB:
>    getBD :: Connection -> String -> IO Float
>    getBD conn name = trace "Entering getBD" noBDfp
>    �  where qry_head_BD_Sidonie = "select `N° BD` from Coordonnées where
>    Nom = ?" :: Query
>    � � � � � � �  bd_rows :: IO [Only Text]
>    � � � � � � �  bd_rows = query conn qry_head_BD_Sidonie (Only
>    (name::String))
>    � � � � � � �  noBDtxt :: IO Text
>    � � � � � � �  noBDtxt = trace "assigning noBDtxt" (fmap (fromOnly .
>    Prelude.head) bd_rows)
>    � � � � � � �  noBDstr :: IO String
>    � � � � � � �  noBDstr = trace "assigning noBDstr" (fmap Text.unpack
>    noBDtxt)
>    � � � � � � �  noBDfp :: IO Float
>    � � � � � � �  noBDfp = fmap read noBDstr
>    which was code different from the code in main,i get in trouble
>    understanding what fmap was doing , and why the same thing to do in
>    main and in a function had so different implementations...
>
>    On Tue, Dec 25, 2018 at 10:19 PM Ian Denhardt <[1]ian at zenhack.net>
>    wrote:
>
>      The correct type annotation for getDB3 should be:
>      �  �  getDB3 :: Connection -> String -> IO Float
>      Note the IO at the end. Functions in Haskell are just pure
>      computation;
>      they can't have side effects -- so a function returning a Float
>      can't
>      possibly talk to a database.
>      Instead, The type `IO a` represents a description of an action to
>      perform.�  It's still just a value -- calling getDB3 doesn't *do*
>      anything. You can stitch these together using do-notation or
>      functions
>      like >>=, and when the program is run the action defined by 'main'
>      is
>      performed.
>      ---
>      An analogy: you could imagine instead of IO we could give up, and
>      write
>      code that computes a program in some other (imperative) programming
>      language) that we then hand off to an interpreter. For example, we
>      could
>      compute a python program that counts from 1 to 99 like so:
>      �  �  printNum :: Int -> String
>      �  �  printNum n = "print('" ++ show n ++ "')\n"
>      �  �  pythonProgram = concatMap printNum [1..99]
>      So we've defined a variable fullProgram that is a string with the
>      source
>      code to a python program like:
>      �  �  print('1')
>      �  �  print('2')
>      �  �  print('3')
>      �  �  ...
>      �  �  print('99')
>      ..but we haven't actually run it. To do that we'd have to pass the
>      string off to the python interpreter.
>      This is a good way to think about what IO is -- main is like our
>      pythonProgram above, in that it is a description of actions to
>      perform,
>      but *evaluating* it doesn't have any side effects -- it just
>      computes
>      the description. When you run a Haskell program, this is like taking
>      the description defined by Main and passing it off to an
>      interpreter.
>      ---
>      So your definition of getDB3 is a description of actions to perform
>      to
>      get a float from the database, but your type declaration says it's a
>      function that computes a float (without having to perform any
>      "actions").
>      This is a critical distinction that exists in Haskell but not most
>      other
>      languages.
>      Hope this helps,
>      -Ian
>      Quoting Damien Mattei (2018-12-25 15:07:35)
>      >�  �  yes i use do notation, but for example i have code that works
>      in main
>      >�  �  and not in a function!
>      >�  �  i print the code perheaps someone could help me:
>      >�  �  first the function, so you have the import list too:
>      >�  �  import Database.MySQL.Simple
>      >�  �  import Database.MySQL.Simple.QueryResults
>      >�  �  import Database.MySQL.Simple.Result
>      >�  �  import Database.MySQL.Simple.QueryParams
>      >�  �  import Database.MySQL.Simple.Param
>      >�  �  import Control.Monad
>      >�  �  import Data.Text as Text
>      >�  �  --import Data.Int as Int
>      >�  �  --import Data.List
>      >�  �  import Debug.Trace
>      >�  �  import Data.Maybe as Maybe
>      >�  �  -- this function will return th N°BD from Sidonie for a
>      given name
>      >�  �  -- note: names have been standardized between Sidonie and WDS
>      >�  �  getBD3 :: Connection -> String -> Float
>      >�  �  getBD3 conn name = do
>      >�  �  � � � � � � � � � � ��  let
>      qry_head_BD_Sidonie = "select `N° BD` from
>      >�  �  Coordonnées where Nom = ?" :: Query
>      >�  �  � � � � � � � � � � ��  (bd_rows ::
>      [Only Text]) <- query conn
>      >�  �  qry_head_BD_Sidonie (Only (name::String))
>      >�  �  � � � � � � � � � � ��  let noBDtxt =
>      fromOnly (Prelude.head bd_rows) ::
>      >�  �  Text
>      >�  �  � � � � � � � � � � ��  let noBDstr =
>      Text.unpack noBDtxt :: String
>      >�  �  � � � � � � � � � � ��  let noBDfp =
>      read $ noBDstr :: Float
>      >�  �  � � � � � � � � � � ��  return noBDfp
>      >�  �  with this function i have this error:
>      >�  �  Prelude> :load UpdateSidonie
>      >�  �  [1 of 1] Compiling Main� � � � � � � � �
>      � � ��  ( UpdateSidonie.hs,
>      >�  �  interpreted )
>      >�  �  UpdateSidonie.hs:54:13: error:
>      >�  �  � � ��  � Couldn't match expected type �Float�
>      with actual type �IO
>      >�  �  Float�
>      >�  �  � � ��  � In a stmt of a 'do' block:
>      >�  �  � � � � � � ��  (bd_rows :: [Only Text]) <-
>      query
>      >�  �  � � � � � � � � � � � � � � �
>      � � � � � � � � � � � � � � � � �
>      � � � �
>      >�  �  � ��  conn qry_head_BD_Sidonie (Only (name :: String))
>      >�  �  � � � � ��  In the expression:
>      >�  �  � � � � � � ��  do let qry_head_BD_Sidonie =
>      ...
>      >�  �  � � � � � � � � � ��  (bd_rows :: [Only
>      Text]) <- query
>      >�  �  � � � � � � � � � � � � � � �
>      � � � � � � � � � � � � � � � � �
>      � � � �
>      >�  �  � � � � ��  conn qry_head_BD_Sidonie (Only (name ::
>      String))
>      >�  �  � � � � � � � � � ��  let noBDtxt = ...
>      >�  �  � � � � � � � � � ��  let noBDstr = ...
>      >�  �  � � � � � � � � � ��  ....
>      >�  �  � � � � ��  In an equation for �getBD3�:
>      >�  �  � � � � � � � � ��  getBD3 conn name
>      >�  �  � � � � � � � � � � ��  = do let
>      qry_head_BD_Sidonie = ...
>      >�  �  � � � � � � � � � � � � � � �
>      ��  (bd_rows :: [Only Text]) <- query
>      >�  �  � � � � � � � � � � � � � � �
>      � � � � � � � � � � � � � � � � �
>      � � � �
>      >�  �  � � � � � � � � � � ��  conn
>      qry_head_BD_Sidonie (Only (name :: String))
>      >�  �  � � � � � � � � � � � � � � �
>      ��  let noBDtxt = ...
>      >�  �  � � � � � � � � � � � � � � �
>      ��  ....
>      >�  �  � ��  |
>      >�  �  54 |� � � � � � � � � � � ��
>      (bd_rows :: [Only Text]) <- query conn
>      >�  �  qry_head_BD_Sidonie (Only (name::String))
>      >�  �  � ��  |� � � � � � � � � � � �
>      >�  �
>      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>      ^^^
>      >�  �  ^^^^^^^^^
>      >�  �  Failed, no modules loaded.
>      >�  �  i do not understand the error complaining that i return an IO
>      >�  �  float,because i'm sure it's a float in noBDfp
>      >�  �  if i put the same lines of code in the main it works !!! :
>      >�  �  main :: IO ()
>      >�  �  main =
>      >�  �  ��  do
>      >�  �  � � ��  conn <- connect defaultConnectInfo
>      >�  �  � � � � ��  { connectHost = "moita",
>      >�  �  � � � � � � ��  connectUser = "mattei",
>      >�  �  � � � � � � ��  connectPassword = "sidonie2",
>      >�  �  � � � � � � ��  connectDatabase = "sidonie" }
>      >�  �  � let qry_head_BD_Sidonie = "select `N° BD` from
>      Coordonnées where
>      >�  �  Nom = ?" :: Query
>      >�  �  � (bd_rows :: [Only Text]) <- query conn
>      qry_head_BD_Sidonie (Only
>      >�  �  (name::String))
>      >�  �  putStr "bd_rows ="
>      >�  �  putStrLn $ show bd_rows
>      >�  �  � � ��  let noBDtxt = fromOnly (Prelude.head bd_rows)
>      :: Text
>      >�  �  � � ��  let noBDstr = Text.unpack noBDtxt :: String
>      >�  �  � � ��  let noBDfp = read $ noBDstr :: Float
>      >�  �  � � ��  putStr "noBDfp ="
>      >�  �  � � ��  (putStrLn (show noBDfp))
>      >�  �  � close conn
>      >�  �  it works i have output like this:
>      >�  �  *Main> main
>      >�  �  bd_rows =[Only {fromOnly = "-04.3982"}]
>      >�  �  noBDtxt ="-04.3982"
>      >�  �  noBDfp =-4.3982
>      >�  �  noBDfp + 1 = -3.3982
>      >�  �  i'm well getting a float in noBDfp , i even can add 1 to it
>      :-) ( cool
>      >�  �  haskell...)
>      >�  �  but i'm just wanting to that in the function getDB3 but it
>      does not
>      >�  �  compile...
>      >�  �  ??????
>      >�  �  Damien
>      >
>      >�  �  On Sun, Dec 23, 2018 at 4:54 PM Tom Ellis
>      >�  �  <[1][2]tom-lists-haskell-cafe-2017 at jaguarpaw.co.uk> wrote:
>      >
>      >�  �  �  I think forgetting about monads and just using do-notation
>      will help
>      >�  �  �  you.
>      >�  �  �  On Sun, Dec 23, 2018 at 04:44:57PM +0100, Damien Mattei
>      wrote:
>      >�  �  �  > i think learning Monads from scratch again will help me
>      >�  �  �  >
>      >�  �  �  > On Sun, Dec 23, 2018 at 4:11 PM Tom Ellis <
>      >�  �  �  > [2][3]tom-lists-haskell-cafe-2017 at jaguarpaw.co.uk>
>      wrote:
>      >�  �  �  >
>      >�  �  �  > > Yes, exactly!
>      >�  �  �  > >
>      >�  �  �  > > On Sun, Dec 23, 2018 at 02:08:57PM +0100, Damien
>      Mattei wrote:
>      >�  �  �  > > > lazyness....?
>      >�  �  �  > > >
>      >�  �  �  > > > On Sun, Dec 23, 2018 at 8:40 AM Tom Ellis <
>      >�  �  �  > > > [3][4]tom-lists-haskell-cafe-2017 at jaguarpaw.co.uk>
>      wrote:
>      >�  �  �  > > >
>      >�  �  �  > > > > On Sat, Dec 22, 2018 at 09:52:18AM +0100, Damien
>      Mattei
>      >�  �  �  wrote:
>      >�  �  �  > > > > > i have inserted trace statement that output
>      variable
>      >�  �  �  > > > > > ... i have strange behavior of output:
>      >�  �  �  > > > >
>      >�  �  �  > > > > Let's take a simpler example.��  Do you
>      understand why the
>      >�  �  �  trace
>      >�  �  �  > > statments
>      >�  �  �  > > > > from this small program appear in the order that
>      they do?�
>      >�  �  �  (And for
>      >�  �  �  > > what
>      >�  �  �  > > > > it's worth I really think you'll be better off
>      writing
>      >�  �  �  programs using
>      >�  �  �  > > do
>      >�  �  �  > > > > notation).
>      >�  �  �  > > > >
>      >�  �  �  > > > >
>      >�  �  �  > > > > % cat test.hs
>      >�  �  �  > > > > import Debug.Trace
>      >�  �  �  > > > >
>      >�  �  �  > > > > result =
>      >�  �  �  > > > >��  � let a = trace "evaluating a" 2
>      >�  �  �  > > > >��  ��  ��  � b = trace "evaluating b" 10
>      >�  �  �  > > > >��  ��  ��  � c = trace "evaluating c" (a +
>      b)
>      >�  �  �  > > > >��  � in c
>      >�  �  �  > > > > ~% ghci -e result test.hs
>      >�  �  �  > > > > evaluating c
>      >�  �  �  > > > > evaluating b
>      >�  �  �  > > > > evaluating a
>      >�  �  �  > > > > 12
>      >�  �  �  > > _______________________________________________
>      >�  �  �  > > Haskell-Cafe mailing list
>      >�  �  �  > > To (un)subscribe, modify options or view archives go
>      to:
>      >�  �  �  > >
>      [4][5]http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
>      >�  �  �  > > Only members subscribed via the mailman list are
>      allowed to
>      >�  �  �  post.
>      >�  �  �  > _______________________________________________
>      >�  �  �  > Haskell-Cafe mailing list
>      >�  �  �  > To (un)subscribe, modify options or view archives go to:
>      >�  �  �  >
>      [5][6]http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
>      >�  �  �  > Only members subscribed via the mailman list are allowed
>      to post.
>      >�  �  �  _______________________________________________
>      >�  �  �  Haskell-Cafe mailing list
>      >�  �  �  To (un)subscribe, modify options or view archives go to:
>      >�  �  �
>      [6][7]http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
>      >�  �  �  Only members subscribed via the mailman list are allowed
>      to post.
>      >
>      > Verweise
>      >
>      >�  �  1. mailto:[8]tom-lists-haskell-cafe-2017 at jaguarpaw.co.uk
>      >�  �  2. mailto:[9]tom-lists-haskell-cafe-2017 at jaguarpaw.co.uk
>      >�  �  3. mailto:[10]tom-lists-haskell-cafe-2017 at jaguarpaw.co.uk
>      >�  �  4.
>      [11]http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
>      >�  �  5.
>      [12]http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
>      >�  �  6.
>      [13]http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
>
> Verweise
>
>    1. mailto:ian at zenhack.net
>    2. mailto:tom-lists-haskell-cafe-2017 at jaguarpaw.co.uk
>    3. mailto:tom-lists-haskell-cafe-2017 at jaguarpaw.co.uk
>    4. mailto:tom-lists-haskell-cafe-2017 at jaguarpaw.co.uk
>    5. http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
>    6. http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
>    7. http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
>    8. mailto:tom-lists-haskell-cafe-2017 at jaguarpaw.co.uk
>    9. mailto:tom-lists-haskell-cafe-2017 at jaguarpaw.co.uk
>   10. mailto:tom-lists-haskell-cafe-2017 at jaguarpaw.co.uk
>   11. http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
>   12. http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
>   13. http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe


More information about the Haskell-Cafe mailing list