If you have a long if/else if/else chain, you might consider a trivial case statement with guards. Whether you think this is attractive is a matter of taste, but it has the fall-through semantics you want and ghc optimizes the _ pattern matching away:

f x = case () of
  _| x == 2    -> 22
  _| x == 4    -> 44
  _| x == 7    -> 77
  _| otherwise -> 55

> f 4
44
> f 9
55

michael rice wrote:
Thanks guys,

I understand what you're telling me, but have some nested IFs and just want to fall through on one of the ELSES but then I end up with two ELSES in a row and nothing between them. Oh, well, on to restructuring.

Michael

--- On *Wed, 10/21/09, Tim Wawrzynczak /<[email protected]>/* wrote:


    From: Tim Wawrzynczak <[email protected]>
    Subject: Re: [Haskell-cafe] Is there a null statement that does nothing?
    To: "michael rice" <[email protected]>
    Cc: [email protected]
    Date: Wednesday, October 21, 2009, 8:49 PM

    Yes, an if statement must have both 'then' and 'else' branches.  As
    an example, what if you had

    let a = if b == 2 then True else False

    and you were missing an else branch?  What would 'a' get assigned to?

    The if statement "returns" a value so must have both branches.

    However, in a monadic constraint, there are the functions 'when' and
    'unless.'  They allow conditional evaluation of expressions in a
    monadic context.  For example,

    main = do
      line <- getLine
      when (line == "hello") putStrLn "Hello back!"

    Cheers,
     - Tim


    On Wed, Oct 21, 2009 at 7:43 PM, michael rice <[email protected]
    </mc/[email protected]>> wrote:

        It looks like both the THEN and the ELSE in an IF expression
        must each have an expression. What's a graceful way to do
        nothing in either or both slots, kind of like the Fortran
        CONTINUE statement.

          --mr

        ================

        [mich...@localhost ~]$ ghci
        GHCi, version 6.10.3: http://www.haskell.org/ghc/  :? for help
        Loading package ghc-prim ... linking ... done.
        Loading package integer ... linking ... done.
        Loading package base ... linking ... done.
        Prelude> if (1==1) then else

        <interactive>:1:15: parse error on input `else'
        Prelude> if (1==1) then True else

        <interactive>:1:24: parse error (possibly incorrect indentation)
        Prelude> if (1==1) then True else False
        True
        Prelude>



        _______________________________________________
        Haskell-Cafe mailing list
        [email protected] </mc/[email protected]>
        http://www.haskell.org/mailman/listinfo/haskell-cafe




_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to