Send Beginners mailing list submissions to beginners@haskell.org To subscribe or unsubscribe via the World Wide Web, visit http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners or, via email, send a message with subject or body 'help' to beginners-requ...@haskell.org
You can reach the person managing the list at beginners-ow...@haskell.org When replying, please edit your Subject line so it is more specific than "Re: Contents of Beginners digest..." Today's Topics: 1. Why is :t 42 ::Num a => a -> a ? (Olumide) 2. Re: Why is :t 42 ::Num a => a -> a ? (Sylvain Henry) 3. Exception/Error Handling Best Practices (Hillary Ryan) 4. Re: Exception/Error Handling Best Practices (Theodore Lief Gannon) ---------------------------------------------------------------------- Message: 1 Date: Sat, 24 Sep 2016 14:54:08 +0100 From: Olumide <50...@web.de> To: The Haskell-Beginners Mailing List - Discussion of primarily beginner-level topics related to Haskell <beginners@haskell.org> Subject: [Haskell-beginners] Why is :t 42 ::Num a => a -> a ? Message-ID: <5463264a-8806-1473-4835-6438a6da0...@web.de> Content-Type: text/plain; charset=utf-8; format=flowed Is 42 a function? And if it is why does 42 + 24 work, if both are functions. I know there's something I'm getting wrong here. Also, is the expression abs -42 an error. I initially thought that abs to the operator (-) first but there is no space between - and 42. Or is there some associativity issue going on here. - Olumide ------------------------------ Message: 2 Date: Sat, 24 Sep 2016 16:05:37 +0200 From: Sylvain Henry <sylv...@haskus.fr> To: beginners@haskell.org Subject: Re: [Haskell-beginners] Why is :t 42 ::Num a => a -> a ? Message-ID: <b144757d-89e5-bbc7-6d55-85c4d615a...@haskus.fr> Content-Type: text/plain; charset=utf-8; format=flowed Hi, > :t 42 42 :: Num t => t The parser has to make some choices to distinguish between negate and subtraction. In ambiguous cases, subtraction is chosen: > abs -42 <interactive>:2:1: error: • Non type-variable argument in the constraint: Num (a -> a) (Use FlexibleContexts to permit this) • When checking the inferred type it :: forall a. (Num (a -> a), Num a) => a -> a > abs (-42) 42 > let abs=10 > abs-42 -32 > abs -42 -32 > abs - 42 -32 > abs (-42) <interactive>:15:1: error: • Non type-variable argument in the constraint: Num (t -> t1) (Use FlexibleContexts to permit this) • When checking the inferred type it :: forall t t1. (Num (t -> t1), Num t) => t1 It leads to some confusion: > fmap (+ 42) [1,2] [43,44] > fmap (- 42) [1,2] <interactive>:12:1: error: • Non type-variable argument in the constraint: Num (a -> b) (Use FlexibleContexts to permit this) • When checking the inferred type it :: forall a b. (Num (a -> b), Num a) => [b] > fmap (flip (-) 42) [1,2] [-41,-40] Cheers Sylvain On 24/09/2016 15:54, Olumide wrote: > Is 42 a function? And if it is why does 42 + 24 work, if both are > functions. I know there's something I'm getting wrong here. > > Also, is the expression abs -42 an error. I initially thought that abs > to the operator (-) first but there is no space between - and 42. Or > is there some associativity issue going on here. > > - Olumide > _______________________________________________ > Beginners mailing list > Beginners@haskell.org > http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners ------------------------------ Message: 3 Date: Sat, 24 Sep 2016 23:49:48 -0500 From: Hillary Ryan <hillaryrya...@gmail.com> To: beginners@haskell.org Subject: [Haskell-beginners] Exception/Error Handling Best Practices Message-ID: <CADB=hlgyavlnwv_gtlxzd1viebmxf_f4ncu6bw9q4eqtbuh...@mail.gmail.com> Content-Type: text/plain; charset="utf-8" Dear Haskellers, I've been working on variants of the following code: connect_from_file :: String -> IO Connection connect_from_file fi = do s <- BL.readFile fi cred <- (decode s :: Maybe Db_cred) c <- connect . reformat_cred $ cred return c What this code intends to do is read a config from a file in JSON, decode the JSON, and then open a connection based the decoded info. This code doesn't compile for several reasons, but I've left it in this form because I believe it is the most convenient for approaching my question: How should I handle errors here? Both readFile (from Bytestring) and connect (from mysql.simple) throw exceptions when things don't go their way, and decode uses maybe. I see four ways of handling these errors: 0) *All typed errors: *I could "capture" all the exceptions in Either types and use an EitherIO monad or transformer to automatically abort when a Left value appears. Now my function looks like: String -> IO (Either MyErrorType Connection) 1) *All exceptions: *I could throw an exception if Nothing appears during decoding. The function looks the same: String -> IO Connection 2) *A mix*: I could leave the connect and readFile functions alone, but return IO (Nothing) if the decoding doesn't work out. Now we have: String -> IO (Maybe Connection) 3) Not 0)-2) So what is the proper way to do things? Many Thanks, Hillary PS For what it is worth, I have read: 0) https://www.schoolofhaskell.com/user/commercial/content/ exceptions-best-practices . I'd love to get feedback on how to apply this article to my question if it is appropriate. 1) https://lexi-lambda.github.io/blog/2016/06/12/four-months-with-haskell/ . From this article and others, I get the sense that there is great confusion in the community as to how to handle errors correctly, and worse yet, that different approaches are not easily compatible. -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://mail.haskell.org/pipermail/beginners/attachments/20160924/7286e4ba/attachment-0001.html> ------------------------------ Message: 4 Date: Sun, 25 Sep 2016 04:53:45 -0700 From: Theodore Lief Gannon <tan...@gmail.com> To: The Haskell-Beginners Mailing List - Discussion of primarily beginner-level topics related to Haskell <beginners@haskell.org> Subject: Re: [Haskell-beginners] Exception/Error Handling Best Practices Message-ID: <cajopsucjjakzp52vdjpbbao2edknvyft340n2tc4+qxjoj+...@mail.gmail.com> Content-Type: text/plain; charset="utf-8" I recently had to deal with a situation like this in a small web service which acts as an on-demand scraper for other sites. It runs on Servant, which uses ExceptT as of a few versions ago (EitherT before that), but for the remote calls it uses Wreq, which throws HttpException values. I needed to be able to report the details of remote errors rather than having them become a generic unhandled exception, so I was stuck with your option 0 -- but with ExceptT rather than Either, and it turns out ExceptT is pretty slick! Here's the resultant code: https://github.com/tejon/Meeseeks/blob/master/src/bin/MeeseeksBox.hs#L42-L48 It's a one-route service so there's a bit of clutter in there that really should be abstracted out and/or done better. (Let's just pretend logE doesn't exist -- semantically, it doesn't!) But other than the bit I documented with a comment, it's entirely straightforward; and IIRC omitting that signature defaulted the type to IOException, which looks like what you want anyway. tl;dr 0.5) ExceptT. On Sat, Sep 24, 2016 at 9:49 PM, Hillary Ryan <hillaryrya...@gmail.com> wrote: > Dear Haskellers, > > I've been working on variants of the following code: > > connect_from_file :: String -> IO Connection > connect_from_file fi = do > s <- BL.readFile fi > cred <- (decode s :: Maybe Db_cred) > c <- connect . reformat_cred $ cred > return c > > What this code intends to do is read a config from a file in JSON, decode > the JSON, and then open a connection based the decoded info. This code > doesn't compile for several reasons, but I've left it in this form because > I believe it is the most convenient for approaching my question: > > How should I handle errors here? > > Both readFile (from Bytestring) and connect (from mysql.simple) throw > exceptions when things don't go their way, and decode uses maybe. I see > four ways of handling these errors: > > 0) *All typed errors: *I could "capture" all the exceptions in Either > types and use an EitherIO monad or transformer to automatically abort when > a Left value appears. Now my function looks like: String -> IO (Either > MyErrorType Connection) > 1) *All exceptions: *I could throw an exception if Nothing appears during > decoding. The function looks the same: String -> IO Connection > 2) *A mix*: I could leave the connect and readFile functions alone, but > return IO (Nothing) if the decoding doesn't work out. Now we have: String > -> IO (Maybe Connection) > 3) Not 0)-2) > > So what is the proper way to do things? > > Many Thanks, > Hillary > > > PS For what it is worth, I have read: > 0) https://www.schoolofhaskell.com/user/commercial/content/exce > ptions-best-practices . I'd love to get feedback on how to apply this > article to my question if it is appropriate. > 1) https://lexi-lambda.github.io/blog/2016/06/12/four-months-with-haskell/ > . From this article and others, I get the sense that there is great > confusion in the community as to how to handle errors correctly, and worse > yet, that different approaches are not easily compatible. > > _______________________________________________ > Beginners mailing list > Beginners@haskell.org > http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners > > -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://mail.haskell.org/pipermail/beginners/attachments/20160925/ce4506fa/attachment-0001.html> ------------------------------ Subject: Digest Footer _______________________________________________ Beginners mailing list Beginners@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners ------------------------------ End of Beginners Digest, Vol 99, Issue 19 *****************************************