Peter,

I think you are right that there is no way in general to prevent a valid graph rewrite to remove a vacuous dependency. That is why seq is there.

The funny business is visible right in the type signature of seq:

seq :: forall a t. a -> t -> t

If seq had nonstrict semantics, this would be isomorphic to t -> t, which is inhabited only by id. So, if seq is going to have any useful effect, it must be strict. Since Haskell is nonstrict by default (absent some deconstruction, which requires knowledge of the value constructors), you need an extra-language primitive to do this. Don't look to "case" to do this.

And other strictifying syntax constructs like ! are just syntactic sugar, so they don't count.

Dan

Peter Verswyvelen wrote:
I totally agree that data dependencies are the best way to do that. And I'm beginning to see why interact might not be suitable for demonstrating FRP. On the other hand, when you say data dependencies, you mean that the value of expression A depends on the value of expression B, but what if that value is not really needed? For example, suppose you want a program that asks the name of the user and then outputs "What a nice name" or "What a weird name" depending on some random value. Even though the input value from the user is not used, we still can't output the text before the input is entered. Again the hidden dependency is time itself I guess, so we should do it the real FRP way, even with dumb console text IO.

Also doesn't Haskell's IO system uses a hidden RealWorld type that has no value but which is passed from between monadics binds in a strict way to make the ordering work? So IO in Haskell is a horrible hack then? :-) If it would be done nicely, in the FRP way, then RealWorld IO would need time stamps to get rid of the hack? So to do console IO the FRP way (say like in Reactive), the input lines from the user would be Event String, and the output also Event String. Each event occurrence has a time stamp, and when merged, they would be ordered. It would be nice to show this example in Reactive. Too bad Reactive doesn't work (and it's not sure it ever will according to the comment of some users), but for a simple example like this, I'm sure it works. In Yampa, I'm not sure how console based IO would work, I guess it would need to generate event non-occurrences (Nothing) when the user did not type anything, and we would need non-blocking IO, so 100% CPU load, since it's pull based, not sure, to be investigated. I haven't worked with Elerea nor Grapefruit yet, but I'm not sure if I should treat the former as a real FRP system since it is not referentially transparent (it would be nice to know which combinators break it). On the other hand, in this simple example, I could use a strict field in an ADT to enforce the input-output dependency, but I guess this is just the same big hack? (see http://hpaste.org/fastcgi/hpaste.fcgi/view?id=8316#a8367)

This silly example is causing lots of feedback, cool :-)

On Thu, Aug 20, 2009 at 7:12 PM, Lennart Augustsson <lenn...@augustsson.net <mailto:lenn...@augustsson.net>> wrote:

    Using seq to control a program's semantics (as in, input-output
    behaviour) is a horrible hack.
    The seq operation there to control space and time aspects of your
    program.
    (The specification of seq doesn't even say that the first argument is
    evaluated before the second one.)
    You should use data dependencies to control your program's semantics.

    On Thu, Aug 20, 2009 at 4:34 PM, David Leimbach<leim...@gmail.com
    <mailto:leim...@gmail.com>> wrote:
     >
     >
     > On Thu, Aug 20, 2009 at 2:52 AM, Jules Bean
    <ju...@jellybean.co.uk <mailto:ju...@jellybean.co.uk>> wrote:
     >>
     >> Peter Verswyvelen wrote:
     >>>
     >>> Not at all, use it for whatever you want to :-)
     >>>
     >>> I'm writing this code because I'm preparing to write a bunch of
    tutorials
     >>> on FRP, and I first wanted to start with simple console based
    FRP, e.g.
     >>> making a little text adventure game, where the input/choices of
    the user
     >>> might be parsed ala parsec, using monadic style, applicative
    style, and
     >>> arrows, and then doing the same with FRP frameworks like
     >>
     >>
     >> This is a really bad place to start a FRP tutorial IMO.
     >>
     >> The interface for 'interact' does not make any promises about
    the relative
     >> evaluation order of the input list / production order of the
    output list.
     >>
     >> That's why you are having to play horrible tricks with seq to
    try to force
     >> the order to be what you want.
     >>
     >> I don't think this is the basis of a robust system or a sensible
    tutorial.
     >>
     >> Just my 2c.
     >
     > Interesting feedback, but I don't get the reason really.  How is
    using seq a
     > "horrible trick"?  It's there for strict evaluation when you need
    it, and in
     > this case it was warranted.
     > And as far as saying it's not a good basis for a robust system,
    I'm also not
     > sure I agree, but a "sensible tutorial", that I could believe as
    I think
     > it's actually quite difficult to explain these topics to people
    in a way
     > they're going to understand right away.
     > Could we perhaps bother you to suggest an alternative along with your
     > criticism?  It would feel a little more constructive at least
    (not that I
     > think you were being terribly harsh)
     > Dave
     > _______________________________________________
     > Haskell-Cafe mailing list
     > Haskell-Cafe@haskell.org <mailto:Haskell-Cafe@haskell.org>
     > http://www.haskell.org/mailman/listinfo/haskell-cafe
     >
     >
    _______________________________________________
    Haskell-Cafe mailing list
    Haskell-Cafe@haskell.org <mailto:Haskell-Cafe@haskell.org>
    http://www.haskell.org/mailman/listinfo/haskell-cafe



_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to