Hi Prime,

This is additional information to organize my brain.

This issue also occurs in single thread.
Especially, when they have side effects.

   seq exp1 exp2

Because compiler can always re-order two expressions
in accordance with seq's denotational semantics.

Regards,
Takenobu


2016-04-30 16:11 GMT+09:00 Takenobu Tani <takenobu...@gmail.com>:

> Hi Jose and Cale,
>
> Thank you for clear and detailed explanation.
>
> short summary:
>
>  * `seq`  used to eliminate/manage space leaks
>  * `pseq` used to specify order of evaluation
>
>  * `seq` is a bad name, but well established.
>  * If we introduce parallelism to standard, we need `pseq` or some method.
>
>
> It's depending on whether or not corresponding to the parallelism.
> I learned a lot. Thank you very much.
>
> Regards,
> Takenobu
>
> 2016-04-30 8:17 GMT+09:00 Cale Gibbard <cgibb...@gmail.com>:
>
>> Well, the value of par x y is identical to that of y, so any expression
>> which you could use to semantically distinguish pseq from seq using par
>> could be rewritten into one which did so without involving par.
>>
>> If the way in which we're telling programs apart involves performance
>> characteristics then it may already be possible to distinguish seq from
>> pseq. It somewhat comes down to whether the implementation of the language
>> is clever enough to notice when compiling seq x y any cases where it might
>> be better to finish evaluating y first and simply evaluate x before making
>> the result of that first evaluation available. GHC does do this
>> rearranging, so probably someone can come up with a good example there.
>> On Apr 29, 2016 5:38 PM, "José Manuel Calderón Trilla" <j...@jmct.cc>
>> wrote:
>>
>>> Hello Takenobu,
>>>
>>> Great question, this is actually a pretty interesting issue! It isn't
>>> out of scope at all.
>>>
>>> The first thing to think about is the following thought experiment:
>>>
>>> Without the presence of side-effects, how can you tell the difference
>>> between a `seq` that conforms to the Haskell report and one that
>>> evaluates it's first argument before its second?
>>>
>>> If your answer involves `unsafePerformIO` then you're cheating ;)
>>>
>>> Even if your first argument to `seq` is an IO action it won't get
>>> executed because `seq` only evaluates to WHNF. It might be possible to
>>> construct a program that allows you to observe the difference, but in
>>> the general case I don't see how you could. I'd be very interested to
>>> be shown otherwise though!
>>>
>>> Now in a parallel program things change. When we use `pseq` it's
>>> because we don't want two threads to collide when trying to evaluate
>>> the same expression. Let's look at an example:
>>>
>>> x `par` y `seq` x + y
>>>
>>> As you noted, the semantics of `seq` doesn't actually guarantee that
>>> `y` will be evaluated before `x + y`. But this only matters because
>>> we've used `par` and introduced threads (via an effect!) and therefore
>>> the possibility of collision. We can avoid this by using `pseq`
>>> instead.
>>>
>>> So, both `seq` and `pseq` both allow the programmer to express
>>> *operational* concerns, `seq` is used mostly to eliminate/manage space
>>> leaks, and `pseq` is used to specify order of evaluation. Those
>>> concerns sometimes overlap, but they are different!
>>>
>>> It could be argued (and I would agree) that `seq` is a bad name; a
>>> better name might have been something like `synch` [1]. That being
>>> said, unless we add parallelism to the standard (and even then) I am
>>> not sure it would be wise to change the operational behavior of `seq`.
>>> It's current behavior is well established, and if you're writing
>>> sequential Haskell code where order of evaluation matters, it's
>>> probably better to reach for a different tool (IMO). However, if
>>> parallelism is introduced then I'd fight for `pseq` to be part of that
>>> (as you suggest).
>>>
>>> I hope that sheds some light on the issue.
>>>
>>> Cheers,
>>>
>>> Jose
>>>
>>> [1]: John Hughes introduced a `synch` combinator in his thesis, but it
>>> had very different semantics, so maybe that's a reason it was avoided?
>>> Someone with more knowledge of the history can probably shed more
>>> light on this.
>>>
>>>
>>> On Thu, Apr 28, 2016 at 6:56 PM, Takenobu Tani <takenobu...@gmail.com>
>>> wrote:
>>> > Dear Community,
>>> >
>>> > Apologies if I'm missing context.
>>> >
>>> > Does Haskell 2020 specify evaluation order control by `pseq`?
>>> >
>>> > We use `pseq` to guarantee the evaluation order between two
>>> expressions.
>>> > But Haskell 2010 did not specify how to control the evaluation order
>>> between
>>> > two expressions.
>>> > (only specified `seq` in Haskell 2010 section 6.2 [1]. but `seq` don't
>>> > guarantee the order. [2])
>>> >
>>> > I think it's better to explicitly specify `pseq` as standard way.
>>> >
>>> > Already discussed? or out of scope?
>>> >
>>> > [1]:
>>> >
>>> https://www.haskell.org/onlinereport/haskell2010/haskellch6.html#x13-1260006.2
>>> > [2]:
>>> >
>>> https://www.schoolofhaskell.com/user/snoyberg/general-haskell/advanced/evaluation-order-and-state-tokens
>>> >
>>> > Regards,
>>> > Takenobu
>>> >
>>> >
>>> > _______________________________________________
>>> > Haskell-prime mailing list
>>> > Haskell-prime@haskell.org
>>> > http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-prime
>>> >
>>> _______________________________________________
>>> Haskell-prime mailing list
>>> Haskell-prime@haskell.org
>>> http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-prime
>>>
>>
>
_______________________________________________
Haskell-prime mailing list
Haskell-prime@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-prime

Reply via email to