$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
Subject: Re: [boost] Interest in an 'either' library?
From: Mathias Gaunard (mathias.gaunard_at_[hidden])
Date: 2013-06-26 15:04:13
On 25/06/13 17:18, Eric Niebler wrote:
>> either<error, int> result =
>>    do(
>>      set( _x, getInt ),
>>      set( _y, getInt ),
>>      doReturn( pure( _x + _y ) ) );
>>
>> If we're going to do that, lets do it generically and completely.
>
> I've been giving serious thought to that recently. The problem with it,
> however, is that it requires the use of Phoenix-style lambda expressions
> like "_x + _y". (I can only assume you mean for _x and _y to be
> placeholders and not actual values. I can't think of another way to
> implement this.) It seems that for such core functionality, we don't
> want to be saddled by Phoenix's syntax and compile-times, but maybe I'm
> wrong.
The following Haskell syntax, transliterated to C++
do
(
   x,
   result = y,
   foo(result)
);
is syntactic sugar for
x >> y >>= [](auto result) { return foo(result); };
or even
x >>= [](auto) { return y >>= [](auto result) { return foo(result); }; };
if you want to avoid specializing statements with no result.
I think it is important to distinguish the support for this sugar and 
the monad system itself.
The monad system itself is just implementing the >>= operator for the 
given monad type.
As a matter of fact this sugar can even be implemented with macros. The 
syntax above is possible with minor adjustments.