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:  applicative instance (Graham Gill)
   2. Re:  Ambiguous type variable prevents the constraint `(Ord
      t0)' from being solved. (鲍凯文)
   3. Re:  applicative instance (sasa bogicevic)


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

Message: 1
Date: Mon, 30 Jan 2017 00:57:26 -0500
From: Graham Gill <math.simp...@gmail.com>
To: Haskell Beginners <beginners@haskell.org>
Subject: Re: [Haskell-beginners] applicative instance
Message-ID: <989594d3-c665-3840-7b49-9e0a0368d...@gmail.com>
Content-Type: text/plain; charset="utf-8"; Format="flowed"


On 28-Jan-2017 4:53 AM, sasa bogicevic wrote:
> Is there a way to do it without defining a separate function like 
> plusPlus ?

My guess is there isn't. I'm unsure what you mean by your question though.

Your List is a reimplementation of Haskell []. So, List with the 
"Cartesian product" Applicative instance will, like Haskell [], extend 
to a Monad instance. In the Monad instance for [], join = concat, and 
the work of concat is done using ++.

For List, we can implement join using concatList:

concatList :: List (List a) -> List a
concatList Nil = Nil
concatList (Cons xs xss) = xs `plusPlus` (concatList xss)

and then we can add a Monad instance for List:

instance Monad List where
     return = pure
     xs >>= f = concatList (pure f <*> xs)

or equivalently, bind isgiven by
     xs >>= f = concatList (fmap f xs)

To ask whether you can define the Cartesian product Applicative instance 
for List without plusPlus, is, I think, like asking whether there is a 
Cartesian product Applicative instance for List (or []) which doesn't 
extend to a Monad instance. Because if it does extend to a Monad (that 
obeys the Monad laws), then there will exist an implementation of join 
:: List (List a) -> List a, and join will need to collapse a List of 
Lists into a List. A function like plusPlus is used to accomplish the 
collapse.

That's "proof by hand waving."

The Ziplist Applicative instance for List on the other hand can't be 
extended to a Monad instance without additional restrictions on the 
lengths of the lists. Your question led me to some interesting reading 
with a google search on "list monad vs ziplist". Thanks.


On 28-Jan-2017 4:53 AM, sasa bogicevic wrote:
> Yep that worked, thanks.
> Is there a way to do it without defining a separate function like plusPlus ?
>
>
>
>
>
>> On Jan 28, 2017, at 10:43, Francesco Ariis<fa...@ariis.it>  wrote:
>>
>> On Sat, Jan 28, 2017 at 10:09:10AM +0100, sasa bogicevic wrote:
>>> Ok so how would the implementation look to get the correct result ?
>>> I can't seem to write something that will compile except ZipList version.
>> One way is by implementing your own (++):
>>
>>     data List a = Nil | Cons a (List a) deriving (Eq, Show)
>>
>>     plusPlus :: List a -> List a -> List a
>>     plusPlus Nil         bs = bs
>>     plusPlus (Cons a as) bs = Cons a (as `plusPlus` bs)
>>
>>     instance Functor List where
>>         fmap f Nil = Nil
>>         fmap f (Cons a b) = Cons (f a) (fmap f b)
>>
>>     instance Applicative List where
>>         pure x = Cons x Nil
>>         Nil <*> _ = Nil
>>         _ <*> Nil = Nil
>>         (Cons x xy) <*> ys = (fmap x ys) `plusPlus` (xy <*> ys)
>>
>> _______________________________________________
>> Beginners mailing list
>> Beginners@haskell.org
>> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
> _______________________________________________
> 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/20170130/9a680355/attachment-0001.html>

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

Message: 2
Date: Mon, 30 Jan 2017 00:38:44 -0800
From: 鲍凯文 <traqueofzi...@gmail.com>
To: beginners@haskell.org
Subject: Re: [Haskell-beginners] Ambiguous type variable prevents the
        constraint `(Ord t0)' from being solved.
Message-ID:
        <camjcg+gcau5s6m-sqnqcstso8hgbbi2fnsmjcfhxdq0op0q...@mail.gmail.com>
Content-Type: text/plain; charset="utf-8"

Hi,

I refactored it as such:

apply_listd []        d x = d x
apply_listd ((a,b):t) d x =
  case compare x a of
    EQ -> a
    GT -> b
    _  -> d x

applyd f d x = look f
  where
    k = 5

    look (Leaf h l)
      | h == k = apply_listd l d x
    look (Branch p b l r)
      | (k `xor` p) .&. (b - 1) == 0 = look (if k .&. b == 0 then l else r)
    look _ = d x

...and it compiled so i'm not sure what happened there. Simpler though:
adding the type signature

applyd :: Ord a => Func a b -> (a -> b) -> a -> b

also made it compile. I'm not sure why ghc thinks there's multiple
instances to choose from (somebody please explain), but in any case adding
type signatures will give you better error messages/help ghc.

Hope that helps a bit.

On Sun, Jan 29, 2017 at 4:00 AM, <beginners-requ...@haskell.org> wrote:

> 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.  Ambiguous type variable prevents the constraint  `(Ord t0)'
>       from being solved. (Ivan Kush)
>
>
> ----------------------------------------------------------------------
>
> Message: 1
> Date: Sat, 28 Jan 2017 23:09:09 +0300
> From: Ivan Kush <ivan.v.k...@yandex.ru>
> To: beginners@haskell.org
> Subject: [Haskell-beginners] Ambiguous type variable prevents the
>         constraint      `(Ord t0)' from being solved.
> Message-ID: <5152611485634...@web34j.yandex.ru>
> Content-Type: text/plain; charset=utf-8
>
> I get this error (full message at the end of the mail). How could I
> correct my code?
>
>
> ===================
> Code:
> ===================
>
> module Intro where
>
> import Data.Bits --  for xor, .&.
>
> data Func a b
>     = Empty
>     | Leaf Int [(a, b)]
>     | Branch Int Int (Func a b) (Func a b)
>
> applyd =
>     let apply_listd l d x =
>                     case l of
>                         [] -> d x
>                         (a, b) : t ->
>                             let c = compare x a
>                             in if c == EQ then b
>                                 else if c == GT then apply_listd t d x
>                                 else d x
>
>      in  \f d x ->
>         let k =  5 -- hash x - todo
>         in let look t =
>                 case t of
>                     Leaf h l | h == k ->
>                         apply_listd l d x
>                     Branch p b l r | (k `xor` p) .&. (b - 1) == 0 -> --
> (Branch p b l r) | ((k xor p) .&. (b - 1)) == 0 ->
>                         look (if k .&. b == 0 then l else r)
>                     _ -> d x
>            in look f
>
>
>
> ===================
> Error:
> ===================
>
> Intro.hs:37:25: error:
>     * Ambiguous type variable `t0' arising from a use of `apply_listd'
>       prevents the constraint `(Ord t0)' from being solved.
>       Relevant bindings include
>         l :: [(t0, t)] (bound at Intro.hs:36:28)
>         t :: Func t0 t (bound at Intro.hs:34:21)
>         look :: Func t0 t -> t (bound at Intro.hs:34:16)
>         x :: t0 (bound at Intro.hs:32:15)
>         d :: t0 -> t (bound at Intro.hs:32:13)
>         f :: Func t0 t (bound at Intro.hs:32:11)
>         (Some bindings suppressed; use -fmax-relevant-binds=N or
> -fno-max-relevant-binds)
>       Probable fix: use a type annotation to specify what `t0' should be.
>       These potential instances exist:
>         instance Ord Ordering -- Defined in `GHC.Classes'
>         instance Ord Integer
>           -- Defined in `integer-gmp-1.0.0.1:GHC.Integer.Type'
>         instance Ord a => Ord (Maybe a) -- Defined in `GHC.Base'
>         ...plus 22 others
>         ...plus five instances involving out-of-scope types
>         (use -fprint-potential-instances to see them all)
>     * In the expression: apply_listd l d x
>       In a case alternative: Leaf h l | h == k -> apply_listd l d x
>       In the expression:
>         case t of {
>           Leaf h l | h == k -> apply_listd l d x
>           Branch p b l r
>             | (k `xor` p) .&. (b - 1) == 0
>             -> look (if k .&. b == 0 then l else r)
>           _ -> d x }
>
>
> --
> Best wishes,
> Ivan Kush
>
>
> ------------------------------
>
> Subject: Digest Footer
>
> _______________________________________________
> Beginners mailing list
> Beginners@haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>
>
> ------------------------------
>
> End of Beginners Digest, Vol 103, Issue 25
> ******************************************
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: 
<http://mail.haskell.org/pipermail/beginners/attachments/20170130/200f246b/attachment-0001.html>

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

Message: 3
Date: Mon, 30 Jan 2017 09:48:38 +0100
From: sasa bogicevic <brutalles...@gmail.com>
To: The Haskell-Beginners Mailing List - Discussion of primarily
        beginner-level topics related to Haskell <beginners@haskell.org>
Subject: Re: [Haskell-beginners] applicative instance
Message-ID: <18d14b30-0de4-4cb0-818e-226865c9d...@gmail.com>
Content-Type: text/plain; charset=us-ascii

Wow thanks for the indepth explanation. I am glad that this got you reading 
some stuff but the fact is I was just doing an exercise in writing Applicative 
instances for some types and it was not stated that we should use separate 
'helper' functions to achieve this. So I banged my head trying to write the 
correct implementation but I could only come up with the zipList solution. 
Thanks again!

Sasa


> On Jan 30, 2017, at 06:57, Graham Gill <math.simp...@gmail.com> wrote:
> 
> 
> On 28-Jan-2017 4:53 AM, sasa bogicevic wrote:
>> Is there a way to do it without defining a separate function like plusPlus ?
> 
> My guess is there isn't. I'm unsure what you mean by your question though.
> 
> Your List is a reimplementation of Haskell []. So, List with the "Cartesian 
> product" Applicative instance will, like Haskell [], extend to a Monad 
> instance. In the Monad instance for [], join = concat, and the work of concat 
> is done using ++.
> 
> For List, we can implement join using concatList:
> 
> concatList :: List (List a) -> List a
> concatList Nil = Nil
> concatList (Cons xs xss) = xs `plusPlus` (concatList xss)
> 
> and then we can add a Monad instance for List:
> 
> instance Monad List where
>     return = pure
>     xs >>= f = concatList (pure f <*> xs)
> 
> or equivalently, bind is given by
>     xs >>= f = concatList (fmap f xs)
> 
> To ask whether you can define the Cartesian product Applicative instance for 
> List without plusPlus, is, I think, like asking whether there is a Cartesian 
> product Applicative instance for List (or []) which doesn't extend to a Monad 
> instance. Because if it does extend to a Monad (that obeys the Monad laws), 
> then there will exist an implementation of join :: List (List a) -> List a, 
> and join will need to collapse a List of Lists into a List. A function like 
> plusPlus is used to accomplish the collapse.
> 
> That's "proof by hand waving."
> 
> The Ziplist Applicative instance for List on the other hand can't be extended 
> to a Monad instance without additional restrictions on the lengths of the 
> lists. Your question led me to some interesting reading with a google search 
> on "list monad vs ziplist". Thanks.
> 
> 
> On 28-Jan-2017 4:53 AM, sasa bogicevic wrote:
>> Yep that worked, thanks.
>> Is there a way to do it without defining a separate function like plusPlus ?
>> 
>> 
>> 
>> 
>> 
>> 
>>> On Jan 28, 2017, at 10:43, Francesco Ariis <fa...@ariis.it>
>>>  wrote:
>>> 
>>> On Sat, Jan 28, 2017 at 10:09:10AM +0100, sasa bogicevic wrote:
>>> 
>>>> Ok so how would the implementation look to get the correct result ?
>>>> I can't seem to write something that will compile except ZipList version.
>>>> 
>>> One way is by implementing your own (++):
>>> 
>>>    data List a = Nil | Cons a (List a) deriving (Eq, Show)
>>> 
>>>    plusPlus :: List a -> List a -> List a
>>>    plusPlus Nil         bs = bs
>>>    plusPlus (Cons a as) bs = Cons a (as `plusPlus` bs)
>>> 
>>>    instance Functor List where
>>>        fmap f Nil = Nil
>>>        fmap f (Cons a b) = Cons (f a) (fmap f b)
>>> 
>>>    instance Applicative List where
>>>        pure x = Cons x Nil
>>>        Nil <*> _ = Nil
>>>        _ <*> Nil = Nil
>>>        (Cons x xy) <*> ys = (fmap x ys) `plusPlus` (xy <*> ys)
>>> 
>>> _______________________________________________
>>> Beginners mailing list
>>> 
>>> Beginners@haskell.org
>>> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>> _______________________________________________
>> Beginners mailing list
>> 
>> Beginners@haskell.org
>> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
> 
> _______________________________________________
> Beginners mailing list
> Beginners@haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners



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

Subject: Digest Footer

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


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

End of Beginners Digest, Vol 103, Issue 26
******************************************

Reply via email to