[GHC] #11650: Documentation does not mention that default definitions for Alternative(some, many) can easily blow up

GHC ghc-devs at haskell.org
Fri Feb 26 11:57:02 UTC 2016


#11650: Documentation does not mention that default definitions for
Alternative(some, many) can easily blow up
-------------------------------------+-------------------------------------
        Reporter:  bgamari           |                Owner:
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Documentation     |              Version:  7.10.3
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------
Description changed by bgamari:

@@ -30,0 +30,10 @@
+ Of course, this can be avoided by simply defining `some` and `many` in
+ `U1`'s `Alternative` instance,
+ {{{#!hs
+ instance Alternative U1 where
+     empty = U1
+     U1 <|> U1 = U1
+     some U1 = U1
+     many U1 = U1
+ }}}
+

New description:

 Consider this case (taken from #11649)
 {{{#!hs
 import Control.Applicative

 data U1 p = U1

 instance Functor U1 where
     fmap f U1 = U1

 instance Applicative U1 where
     pure _ = U1
     U1 <*> U1 = U1

 instance Alternative U1 where
     empty = U1
     U1 <|> U1 = U1

 instance Show (U1 p) where
     show U1 = "U1"

 main = print (some U1)
 }}}

 This looks fine, right? Wrong,
 {{{
 $ ./Main
 Main: <<loop>>
 }}}

 Of course, this can be avoided by simply defining `some` and `many` in
 `U1`'s `Alternative` instance,
 {{{#!hs
 instance Alternative U1 where
     empty = U1
     U1 <|> U1 = U1
     some U1 = U1
     many U1 = U1
 }}}

 It seems that the default definitions of `some` and `many` will produce
 looping code in these cases (although it's not entirely clear to me which
 cases "these" cases are).

 I suppose this is due to the fact that `U1` will always "succeed". We
 should ensure that this is noted in the documentation to ensure that users
 don't end up with accidentally bottoming instances.
 Well, consider what happens

--

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/11650#comment:3>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list