Laws and partial values (was: [Haskell-cafe] mapM_ -> Monoid.Monad.map)

roconnor at theorem.ca roconnor at theorem.ca
Fri Jan 23 22:22:38 EST 2009


Thanks for letting me reflect on this.

I assume that my final program (my final value) is always a total value. 
Anything else is an error.  Therefore, if we required relaxed monoid laws 
of the form

x `mappend` mzero <= x

then we could safely substitute (x `mappend` mzero) by x without changing 
the final value (I think this true).  But the reverse substituion 
,replacing x with (x `mappend` mzero), might not be sound.  Now, I can see 
why you would prefer that the laws hold for partial values.

On Fri, 23 Jan 2009, Luke Palmer wrote:

> On Fri, Jan 23, 2009 at 6:10 PM, <roconnor at theorem.ca> wrote:
>       On Fri, 23 Jan 2009, Derek Elkins wrote:
>
>             mempty `mappend` undefined = undefined (left
>             identity monoid law)
>             The above definition doesn't meet this, similarly
>             for the right identity
>             monoid law.  That only leaves one definition, ()
>             `mappend` () = () which
>             does indeed satisfy the monoid laws.
>
>             So the answer to the question is "Yes."  Another
>             example of making
>             things as lazy as possible going astray.
> 
>
>       I'd like to argue that laws, such as monoid laws, do not apply
>       to partial values.  But I haven't thought my position through
>       yet.
> 
> 
> Please try to change your mind.  
> 
> You know how annoying it is when you are doing math, and you want to divide,
> but first you have to add the provision that the denominator isn't zero.
>  Saying that monoid laws do not apply to partial values, while easing the
> implementation a bit, add similar provisions to reasoning. 
> 
> For example, it is possible to prove that foldr mappend mempty (x:xs) =
> foldr1 mappend (x:xs).  Which means that anywhere in the source where we see
> the former, we can "clean it up" to the latter.  However, if monad laws
> don't apply to partial values, then we first have to prove that none of the
> (x:xs) are _|_, perhaps even that no substrings are _|_.  This is a much
> more involved transformation, so much so that you probably just wouldn't do
> it if you want to be correct.
> 
> Bottoms are part of Haskell's semantics; theorems and laws have to apply to
> them to.  You can pretend they don't exist, but then you have to be okay
> with never using an infinite data structure.  I.e. if your programs would
> run just as well in Haskell as they would in a call-by-value language, then
> you don't have to worry about bottoms.
> 
> Luke
> 
>

-- 
Russell O'Connor                                      <http://r6.ca/>
``All talk about `theft,''' the general counsel of the American Graphophone
Company wrote, ``is the merest claptrap, for there exists no property in
ideas musical, literary or artistic, except as defined by statute.''


More information about the Haskell-Cafe mailing list