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. incoherent instance question (Graham Gill) 2. Re: incoherent instance question (Alex Rozenshteyn) 3. ghc-8.4.3 at Ubuntu (Andreas Röhler) 4. Re: ghc-8.4.3 at Ubuntu (Jeffrey Brown) ---------------------------------------------------------------------- Message: 1 Date: Sun, 3 Jun 2018 23:42:54 -0400 From: Graham Gill <math.simp...@gmail.com> To: The Haskell-Beginners Mailing List - Discussion of primarily beginner-level topics related to Haskell <beginners@haskell.org> Subject: [Haskell-beginners] incoherent instance question Message-ID: <caeqrveqrjw0-n_6qcv1k4pxtjnwkdjv0_r_bf_nidt7dzpm...@mail.gmail.com> Content-Type: text/plain; charset="utf-8" Please see the paste: https://pastebin.com/zBim7Zkx I'm experimenting with defining UpperBounded and LowerBounded typeclasses. An example type belonging to the latter that is not also Bounded would be type Natural from Numeric.Natural. I want to say that if a type is Bounded, then it is also UpperBounded and LowerBounded. If a type is both UpperBounded and LowerBounded, then it is also Bounded. To express the constraints, I need FlexibleInstances and UndecidableInstances extensions. These allow the module to load into ghci (8.4.2) with only a warning, but, without the INCOHERENT pragmas, I get an overlapping instance error if I try to evaluate minBound, maxBound, upperBound or lowerBound instantiated to either of the types Foo or Bar. A solution is to apply the INCOHERENT pragma to the instances at lines 11, 14 and 17. Reading over section 10.8.3.6. Overlapping instances in the GHC User Guide, I believe I understand. (Is there a better solution?) In the paste, I have INCOHERENT pragmas only at lines 11 and 17. This gives me the following behaviour in ghci: 1. minBound, maxBound, upperBound and lowerBound instantiated to type Foo all function as expected, evaluating to the appropriate lower or upper bound. 2. upperBound and maxBound instantiated at Bar give overlapping instance errors for UpperBounded, as expected. 3. lowerBound :: Bar evaluates to C, as expected. 4. minBound :: Bar gives an overlapping instance error for UpperBounded: *UpperLowerBounded> minBound :: Bar <interactive>:141:1: error: • Overlapping instances for UpperBounded Bar arising from a use of ‘minBound’ Matching instances: instance [safe] Bounded a => UpperBounded a -- Defined at UpperLowerBounded.hs:14:10 instance [safe] UpperBounded Bar -- Defined at UpperLowerBounded.hs:31:10 • In the expression: minBound :: Bar In an equation for ‘it’: it = minBound :: Bar It's #4 that I don't understand. An explanation would be very much appreciated. (Also, what's a [safe] instance?) Regards, Graham -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://mail.haskell.org/pipermail/beginners/attachments/20180603/a6d3fbfb/attachment-0001.html> ------------------------------ Message: 2 Date: Sun, 3 Jun 2018 22:10:04 -0700 From: Alex Rozenshteyn <rpglove...@gmail.com> To: simplex.math.servi...@gmail.com, The Haskell-Beginners Mailing List - Discussion of primarily beginner-level topics related to Haskell <beginners@haskell.org> Subject: Re: [Haskell-beginners] incoherent instance question Message-ID: <CALm==bubboyplrrbsgyue0u-gczhen9-cvyrsn1nwsrdkbe...@mail.gmail.com> Content-Type: text/plain; charset="utf-8" > > I want to say that if a type is Bounded, then it is also UpperBounded and > LowerBounded. Seems reasonable > If a type is both UpperBounded and LowerBounded, then it is also Bounded. Danger Will Robinson. Nothing stops modules (realistically, in two different library) from defining incompatible UpperBounded and LowerBounded instances; for example, I may want `lowerBound :: Bool` to be `True`, while you may want `upperBound :: Bool` to be `True`; when they are both imported, bad things can happen. In this case, requiring an Ord constraint and adding documentation on lawful instances would pretty much solve the problem, but in general, this is an unwise thing to do. Specifically, it is usually a bad idea to have a type class that should have an instance for a type whenever that type has instances of some combination of other classes. Three ways around it: - Use a newtype wrapper: define `newtype LowerUpperBounded` and have the instance be `(LowerBounded a, UpperBounded a) => Bounded (LowerUpperBounded a)` - Defer instance definition to concrete types: if you know that a specific type has both super-instances, you can explicitly instantiate it at the sub-instance - Define a constraint alias: (this requires some more advanced extensions, so I'm only mentioning it as an option for completeness' sake) Using `ConstraintKinds`, you can define `type Bounded a = (LowerBounded a, UpperBounded a)`; this makes the two definitions synonymous. To your immediate question, I *think* what's happening is that when you're trying to do `minBound :: Bar` it looks for an instance `Bounded Bar` and finds the unique one; then it needs to satisfy the constraints, so it looks for `LowerBounded Bar` and `UpperBounded Bar`, the latter of which has two possible instances, neither of which is marked overlapping or incoherent. You'll notice that if you use `-fdefer-type-errors` you will be able to get the `minBound` of `Bar` (though for some reason you need to bind it to a variable), but not the `maxBound`. You should also note that if you use the `OVERLAPPABLE` pragma rather than the `INCOHERENT` one, you get the same results, and that is generally considered less risky. On Sun, Jun 3, 2018 at 8:43 PM Graham Gill <math.simp...@gmail.com> wrote: > Please see the paste: https://pastebin.com/zBim7Zkx > > I'm experimenting with defining UpperBounded and LowerBounded typeclasses. > An example type belonging to the latter that is not also Bounded would be > type Natural from Numeric.Natural. > > I want to say that if a type is Bounded, then it is also UpperBounded and > LowerBounded. If a type is both UpperBounded and LowerBounded, then it is > also Bounded. > > To express the constraints, I need FlexibleInstances and > UndecidableInstances extensions. These allow the module to load into ghci > (8.4.2) with only a warning, but, without the INCOHERENT pragmas, I get an > overlapping instance error if I try to evaluate minBound, maxBound, > upperBound or lowerBound instantiated to either of the types Foo or Bar. > > A solution is to apply the INCOHERENT pragma to the instances at lines 11, > 14 and 17. Reading over section 10.8.3.6. Overlapping instances in the GHC > User Guide, I believe I understand. (Is there a better solution?) > > In the paste, I have INCOHERENT pragmas only at lines 11 and 17. This > gives me the following behaviour in ghci: > > 1. minBound, maxBound, upperBound and lowerBound instantiated to type > Foo all function as expected, evaluating to the appropriate lower or upper > bound. > 2. upperBound and maxBound instantiated at Bar give overlapping > instance errors for UpperBounded, as expected. > 3. lowerBound :: Bar evaluates to C, as expected. > 4. minBound :: Bar gives an overlapping instance error for > UpperBounded: > > *UpperLowerBounded> minBound :: Bar > > <interactive>:141:1: error: > • Overlapping instances for UpperBounded Bar > arising from a use of ‘minBound’ > Matching instances: > instance [safe] Bounded a => UpperBounded a > -- Defined at UpperLowerBounded.hs:14:10 > instance [safe] UpperBounded Bar -- Defined at > UpperLowerBounded.hs:31:10 > • In the expression: minBound :: Bar > In an equation for ‘it’: it = minBound :: Bar > > > It's #4 that I don't understand. An explanation would be very much > appreciated. (Also, what's a [safe] instance?) > > Regards, > Graham > > _______________________________________________ > 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/20180603/34413e53/attachment-0001.html> ------------------------------ Message: 3 Date: Mon, 4 Jun 2018 09:09:57 +0200 From: Andreas Röhler <andreas.roeh...@easy-emacs.de> To: The Haskell-Beginners Mailing List - Discussion of primarily beginner-level topics related to Haskell <beginners@haskell.org> Subject: [Haskell-beginners] ghc-8.4.3 at Ubuntu Message-ID: <8f53b1b9-842a-b15e-0670-9b6f04e63...@easy-emacs.de> Content-Type: text/plain; charset=utf-8; format=flowed While installing ghc-8.4.3-i386-deb8-linux.tar.xz at Debian8 went smoothly, can't se how to install ghc-8.4.3 at Ubuntu resp. Xubuntu: in dir ghc-8.4.3/ ./configure checking for gfind... no checking for find... /usr/bin/find checking for sort... /usr/bin/sort checking for GHC Git commit id... given 51abb1c88b53e2989a2a8c2939ac4abc04bef194 checking for ghc... /usr/bin/ghc checking version of ghc... 7.10.3 configure: error: GHC version 8.0 or later is required to compile GHC. Did cabal update and tried haskell-platform for ubuntu https://www.haskell.org/platform/linux.html#linux-ubuntu which seems broken Tried Haskell-platform from source: ./platform.sh *** *** Building hptool *** cabal: unrecognised command: new-build (try --help) Any help? Cheers, Andreas ------------------------------ Message: 4 Date: Mon, 4 Jun 2018 02:22:23 -0500 From: Jeffrey Brown <jeffbrown....@gmail.com> To: The Haskell-Beginners Mailing List - Discussion of primarily beginner-level topics related to Haskell <beginners@haskell.org> Subject: Re: [Haskell-beginners] ghc-8.4.3 at Ubuntu Message-ID: <caec4ma0n0qolqarhjkdzjyqcgmw9+w5bygjh1mj0jaor+uj...@mail.gmail.com> Content-Type: text/plain; charset="utf-8" You could use stack instead of cabal. The most recent nightly stack snapshots use GHC 8.4.3. Stack has a lot[1] of advantages. One of them is that you can use a bunch of different versions of GHC at the same time. Whereas Cabal keeps a global collection of Haskell software, Stack keeps a bunch of different local ones, while cleverly avoiding wasting memory like you might expect that to imply. If you have a project that needs old stuff that's incompatible with new stuff, you're SOL with Cabal but it's no problem in Stack. [1] https://stackoverflow.com/questions/30913145/what-is-the-difference-between-cabal-and-stack On Mon, Jun 4, 2018 at 2:08 AM Andreas Röhler <andreas.roeh...@easy-emacs.de> wrote: > While installing ghc-8.4.3-i386-deb8-linux.tar.xz at Debian8 went > smoothly, can't se how to install ghc-8.4.3 at Ubuntu resp. Xubuntu: > > > in dir ghc-8.4.3/ > > ./configure > checking for gfind... no > checking for find... /usr/bin/find > checking for sort... /usr/bin/sort > checking for GHC Git commit id... given > 51abb1c88b53e2989a2a8c2939ac4abc04bef194 > checking for ghc... /usr/bin/ghc > checking version of ghc... 7.10.3 > configure: error: GHC version 8.0 or later is required to compile GHC. > > Did cabal update > > and tried haskell-platform for ubuntu > https://www.haskell.org/platform/linux.html#linux-ubuntu > > which seems broken > > Tried Haskell-platform from source: > > ./platform.sh > *** > *** Building hptool > *** > cabal: unrecognised command: new-build (try --help) > > > Any help? > > Cheers, > Andreas > > _______________________________________________ > Beginners mailing list > Beginners@haskell.org > http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners > -- Jeff Brown | Jeffrey Benjamin Brown Website <https://msu.edu/~brown202/> | Facebook <https://www.facebook.com/mejeff.younotjeff> | LinkedIn <https://www.linkedin.com/in/jeffreybenjaminbrown>(spammy, so I often miss messages here) | Github <https://github.com/jeffreybenjaminbrown> -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://mail.haskell.org/pipermail/beginners/attachments/20180604/c4774617/attachment.html> ------------------------------ Subject: Digest Footer _______________________________________________ Beginners mailing list Beginners@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners ------------------------------ End of Beginners Digest, Vol 120, Issue 1 *****************************************