"interact" behaves oddly if used interactively
Christian Maeder
maeder at tzi.de
Wed Oct 1 17:42:51 EDT 2003
I wrote:
>>But looking at the two actions of interact:
>>
>>interact f = do
>> s <- getContents
>> putStr (f s)
>>
>>I would expect the first action to be finished before the second
Keith Wansbrough wrote:
> Why?
Because the actions are written down in that order? Why not? Why should
I expect pipelining? Occam's razor demands the simplest theory.
> For the use of laziness, consider
>
> let fib = 0 : 1 : zipWith (+) fib (tail fib) in fib
>
> and think what would happen if "let" was strict. Programming in
> Haskell can be much more convenient than in strict languages, and
> laziness is assumed in lots of little ways throughout idiomatic Haskell
> code (I'm thinking of the liberal use of "where" and "let" bindings,
> for example).
I know and appreciate these uses of laziness. There are plenty of
examples where eager or lazy evaluation can bite you or save you. It's
good to have both, and even better if you do not need to worry about it
too often.
> getContents behaves according to the specification in the standard,
> which is good enough for me. So does putStr.
Allow me to have another opinion, if the consequence is interleaved in-
and output (when I don't want it).
Can actually someone supply an implementation of something like interact
that does no pipelining for the argument "id"? Simply doing "putStr !$ f
!$ s" was not enough!
> HTH.
Thanks, Christian
More information about the Haskell
mailing list