Send Beginners mailing list submissions to
        beginners@haskell.org

To subscribe or unsubscribe via the World Wide Web, visit
        http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
or, via email, send a message with subject or body 'help' to
        beginners-requ...@haskell.org

You can reach the person managing the list at
        beginners-ow...@haskell.org

When replying, please edit your Subject line so it is more specific
than "Re: Contents of Beginners digest..."


Today's Topics:

   1. Re:  Monad for Pair (Mike Houghton)
   2. Re:  Monad for Pair (Mike Houghton)
   3. Re:  Monad for Pair (Marcin Mrotek)


----------------------------------------------------------------------

Message: 1
Date: Thu, 19 Nov 2015 18:30:54 +0000
From: Mike Houghton <mike_k_hough...@yahoo.co.uk>
To: The Haskell-Beginners Mailing List - Discussion of primarily
        beginner-level topics related to Haskell <beginners@haskell.org>
Subject: Re: [Haskell-beginners] Monad for Pair
Message-ID: <d9e67817-0ccf-4bb6-995b-32aa05ba6...@yahoo.co.uk>
Content-Type: text/plain; charset="utf-8"

"But how do you take an arbitrary type and turn it into a monoid??

I didn?t -  I must have been dreaming about Haskell at that point :)   (My wife 
once dreamt she was a C compiler - go figure? C !!??) 
No, just Monad, Applicative and Functor - my mistake.

Thanks 

Mike



> On 19 Nov 2015, at 06:34, Kim-Ee Yeoh <k...@atamo.com> wrote:
> 
> 
> On Thu, Nov 19, 2015 at 1:33 AM, Mike Houghton <mike_k_hough...@yahoo.co.uk 
> <mailto:mike_k_hough...@yahoo.co.uk>> wrote:
> 
> The source is just me exploring. 
> 
> Nice.
>  
> I first looked at 
> 
> data C a = C a deriving (Show)
> 
> and made Monad, Applicative, Monoid and Functors for it.
> 
> Even though the null-effect instances for the identity functor are trivial, 
> there's value in writing them out, especially for the motivated.
> 
> But how do you take an arbitrary type and turn it into a monoid?
> 
> -- Kim-Ee
> _______________________________________________
> Beginners mailing list
> Beginners@haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners

-------------- next part --------------
An HTML attachment was scrubbed...
URL: 
<http://mail.haskell.org/pipermail/beginners/attachments/20151119/3689f09f/attachment-0001.html>

------------------------------

Message: 2
Date: Thu, 19 Nov 2015 18:31:23 +0000
From: Mike Houghton <mike_k_hough...@yahoo.co.uk>
To: The Haskell-Beginners Mailing List - Discussion of primarily
        beginner-level topics related to Haskell <beginners@haskell.org>
Subject: Re: [Haskell-beginners] Monad for Pair
Message-ID: <9a6e25af-1538-441c-9992-9cc586eb6...@yahoo.co.uk>
Content-Type: text/plain; charset=utf-8

Thanks for this - I?ll work through it.

Mike

> On 18 Nov 2015, at 08:28, Marcin Mrotek <marcin.jan.mro...@gmail.com> wrote:
> 
>> You might want to try writing out a test instance in full and re-checking 
>> the second law.
> 
> Ok, while the part upto Applicative is correct and unambiguous:
> 
> data Pair a = Pair a a
> 
> instance Functor Pair where
>  fmap f (Pair a b) = Pair (f a) (f b)
> 
> instance Applicative Pair where
>  pure a = Pair a a
>  Pair fa fb <*> Pair a b = Pair (fa a) (fb b)
> 
> there are at least two implementations of Monad (assuming return=pure,
> also GHC 7.10 allows omitting return and implements it exactly like
> that):
> 
> -- implementation (a)
> instance Monad Pair where
>  Pair a _ >>= k = k a
> 
> -- implementation (b)
> instance Monad Pair where
>  Pair _ b >>= k = k b
> 
> ... neither of which can satisfy the laws. There are more:
> 
> -- implementation (c)
> instance Monad Pair where
>  Pair a b >>= k = Pair a' b'
>    where
>      Pair a' _ = k a
>      Pair _ b' = k b
> 
> -- implementation (d)
> instance Monad Pair where
>  Pair a b >>= k = Pair a' b'
>    where
>      Pair _ b' = k a
>      Pair a' _ = k b
> 
> and, well:
> 
> instance Monad Pair where
>  Pair a b >>= _ = Pair a b
> 
> Did I miss anything? Now, trying to get the second law to work:
> 
> a) m >>= return = m
> Pair a b >>= (\a -> Pair a a) = Pair a b
> Pair a a = Pair a b
> contradiction.
> 
> b) m >>= return = m
> Pair a b >>= (\a -> Pair a a) = Pair a b
> Pair b b = Pair a b
> contradiction.
> 
> c) m >>= return = m
> Pair a b >>= (\a -> Pair a a) = Pair a b
> Pair a b = Pair a b
> no contradiction this time, I'll write the other laws after I'm done
> with the second for the other instances.
> 
> d) m >>= return = m
> Pair a b >>= (\a -> Pair a a) = Pair a b
> Pair b a = Pair a b
> contradiction.
> 
> e) m >>= return = m
> trivially correct.
> 
> Testing the first law for (c) and (e) that passed the second law:
> 
> c) return a >>= k = k a
> Pair a a >>= k a = k a
> ---
> Pair a' b' = k a
>  where
>    Pair a' _ = k a
>    Pair _ b' = k a
> ---
> no contradiction again.
> 
> e) return a >>= k = k a
> return a = k a
> contradiction.
> 
> Okay, then testing the third law for (c):
> 
> m >>= (\x -> k x >>= h)  =  (m >>= k) >>= h
> 
> Pair a b >>=  (\x -> k x >>= h) = (Pair a b >>= k) >>= h (*)
> 
> Let's again unpack the application of >>= in some pseud-haskell:
> 
> Pair a1 _ = (\x -> k x >>= h) a = k a >>= h (**)
> Pair _ b1 = (\x -> k x >>= h) b = k b >> =h
> 
> Pair a2 _ = k a (***)
> Pair _ b2 = k b
> 
> plugging it into (*):
> 
> Pair a1 b1 = Pair a2 b2 >>= h
> 
> Unpacking >>= again:
> 
> Pair a3 _ = h a2 (****)
> Pair _ b3 = h b2
> 
> Pair a1 b1 = Pair a3 b3
> 
> Now, testing if a1 = a3, lets bring in (**), (***), and (****):
> 
> Pair a1 _ = k a >>= h
> Pair a2 _ = k a
> Pair a3 _ = h a2
> 
> Form the first and the second equations (also using the one for b2
> earlier, but it's going to be dropped anyway sooner or later) we get:
> 
> Pair a1 _ = Pair a2 b2 >>= h
> 
> Unpacking >>= :
> 
> Pair a4 _ = h a2
> Pair _ b4 = h b2
> 
> But from the third equation we know that (Pair a3 _ = h a2) so:
> 
> Pair a1 _ = Pair a3 _
> 
> This does seem to work, I have no idea why. I'm pretty sure there I've
> made a mistake somewhere. Perhaps I shouldn't do equational reasoning
> after just getting up, or just use Agda :-/
> 
> Best regards,
> Marcin Mrotek
> _______________________________________________
> Beginners mailing list
> Beginners@haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners



------------------------------

Message: 3
Date: Thu, 19 Nov 2015 19:56:39 +0100
From: Marcin Mrotek <marcin.jan.mro...@gmail.com>
To: The Haskell-Beginners Mailing List - Discussion of primarily
        beginner-level topics related to Haskell <beginners@haskell.org>
Subject: Re: [Haskell-beginners] Monad for Pair
Message-ID:
        <CAJcfPz=yvPEpbxQipJKv8u4NEOV13Pe-kiz3z=uzXanniq=o...@mail.gmail.com>
Content-Type: text/plain; charset=UTF-8

> Thanks for this - I?ll work through it.

Yeah, apparently I accidentaly wrote a correct instance there. You can
also use what Gesh wrote, and try to derive an instance from something
like:

tabulate :: (Bool -> a) -> Pair a
tabulate f = Pair (f True) (f False)

index :: Pair a -> Bool -> a
index (Pair a _) True = a
index (Pair _ b) False = b

instance Applicative Pair where
   pure = tabulate . pure
   fp <*> fa = tabulate $ index fp <*> index fa

instance Monad Pair where
  m >>= f = tabulate $ index m >>= index . f

The instances for a function are (in pseudo-Haskell, I don't think GHC
accepts (a ->) instead of ((->) a), but it looks cleaner that way)

instance Applicative (a ->) where
  pure = const
  f <*> g = \x -> f x (g x)

instance Monad (a ->) where
  f >>= k = \ r -> k (f r) r

> My wife once dreamt she was a C compiler - go figure? C !!??

C isn't exactly known for type safety, so things can indeed get
Kafkaesque sometimes.

Best regards,
Marcin Mrotek


------------------------------

Subject: Digest Footer

_______________________________________________
Beginners mailing list
Beginners@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners


------------------------------

End of Beginners Digest, Vol 89, Issue 34
*****************************************

Reply via email to