[GHC] #11555: catch _|_ breaks at -O1
GHC
ghc-devs at haskell.org
Fri Feb 12 19:00:21 UTC 2016
#11555: catch _|_ breaks at -O1
-------------------------------------+-------------------------------------
Reporter: slyfox | Owner:
Type: bug | Status: new
Priority: highest | Milestone: 8.0.1
Component: Compiler | Version: 8.0.1-rc2
Resolution: | Keywords:
Operating System: Unknown/Multiple | Architecture:
Type of failure: Incorrect result | Unknown/Multiple
at runtime | Test Case:
Blocked By: | Blocking:
Related Tickets: | Differential Rev(s):
Wiki Page: |
-------------------------------------+-------------------------------------
Comment (by rwbarton):
We could provide both `catch`-made-strict and `safeCatch`, and maybe
discuss which should be the "default" in the sense of using the existing
name `catch`. Though it's not just `catch`, there's `try` and other
related functions as well. Maybe better to add a new `execute a = join
(evaluate a)`.
Simon, you wrote elsewhere (ticket:10712#comment:22):
> `catch` is ''not'' strict in its argument. Its argument is a function;
`catch` just guarantees to call that function.
But I don't understand. Really `catch` has two arguments `catch act
handler` and we're talking about strictness in `act`. Isn't `catch` strict
in `act` (once applied to `handler`)? If `act` itself is _|_ then we are
saying (in #10712) then `catch act handler` is allowed to be _|_. The
funny property of `catch` comes in the fact that even though `catch` is
going to ''apply'' `act`, it is not strict in that application because of
its magical turning-bottom-into-non-bottom property. So, doesn't `catch`
just have the same strictness in `act` as does, say, `seq` at a function
type?
Similarly I don't understand this excerpt from Note [Exceptions and
strictness]:
> This also applies uniformly to free variables. Consider
> {{{
> let r = \st -> raiseIO# blah st
> in catch# (\s -> ...(r s')..) handler st
> }}}
> If we give the first argument of catch a strict signature, we'll get a
demand 'C(S)' for 'r'; that is, 'r' is definitely called with one
argument, which indeed it is.
Why can't we give `catch#` a signature that says it is strict in its
argument, without necessarily ''calling'' that argument? Just like `seq`.
I see that 9915b6564403a6d17651e9969e9ea5d7d7e78e7f is quite a large
commit, so likely I'm missing the whole picture.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/11555#comment:10>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list