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:  merge error (Hemanth Gunda)


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

Message: 1
Date: Fri, 18 May 2018 12:18:14 +0530
From: Hemanth Gunda <hemanth....@gmail.com>
To: beginners@haskell.org
Subject: Re: [Haskell-beginners] merge error
Message-ID:
        <cajmdxup2cjjigbo60nkscbzj7d5jd2sh8vfyv_r98tqgtgo...@mail.gmail.com>
Content-Type: text/plain; charset="utf-8"

Hi Trent,

*why first == first@(x:xs), especially weather the variable declarations
are considered names for the same thing. *

first@(x:xs) is meant to be read as below:

"first as (x:xs)".

This is syntactic sugar that gives you the flexibility to address the
entire list as "first", the first element (head) of the list as "x" and the
rest of the list (tail) as xs.

If you don't want to use @, you can write the last case in your program as:

merge first second | (head first) <= (head second)     = (head first) :
merge (tail first) second

                   | otherwise  = (head second): merge first (tail second)

instead of

merge first@(x:xs) second@(y:ys) | x <= y     = x : merge xs second

                                 | otherwise  = y : merge first ys

Relevant SO question :
https://stackoverflow.com/questions/1153465/what-does-the-symbol-mean-in-reference-to-lists-in-haskell

*why [x] /= xs *

when you call merge as:

> merge first second

from merge type signature,

merge :: Ord a => [a] -> [a] -> [a]

 we know it takes  two lists of type a, belonging to typeclass Ord (where
<, >  has meaning)

first & second checked for being a list & whatever is present inside the
list is expected to be of typeclass Ord.

Case A: If you wrote merge [x] [] = [x]

[x] is expected to be a list of Ord
which means x is expected to be Ord.

Case B: if you called merge x [] = x

x is expected to be a list of Ord.

When you call merge [4,5] []

In Case A, it implies "4,5" is a member of Ord, as this is x. Which it
isn't (as 3 <"4,5" has no meaning). Therefore merge [x] [] = [x] isn't
executed here, the program goes looking for other cases & doesn't find any
that satisfies these input types & leads to the error you encountered.

In Case B, it imples [4,5] is a list of Ords, which corresponds to the
correct type. Therefore this statement is executed.

Regards, Hemanth


On Fri, May 18, 2018 at 11:34 AM trent shipley <trent.ship...@gmail.com>
wrote:

> Thanks to all. I used Mukesh's suggestion.
>
> I am still not clear on:
>
> why [x] /= xs
> why first == first@(x:xs), especially weather the variable declarations
> are considered names for the same thing.
>
> On Thu, May 17, 2018 at 10:39 PM Hemanth Gunda <hemanth....@gmail.com>
> wrote:
>
>> Hi Trent,
>>
>> This works:
>>
>> merge:: Ord a => [a] -> [a] -> [a]
>> merge [] [] = []
>> merge x [] = x
>> merge [] y = y
>> merge first@(x:xs) second@(y:ys)
>> | x <= y = x : merge xs second
>> | otherwise = y : merge first ys
>>
>> Difference in the lines
>>
>> merge x [] = x
>> merge [] y = y
>>
>> As the input is of type [a] where a belongs to typeclass Ord, you must
>> pass x instead of [x].
>>
>> [x] would work if you tried merge [4] []. but will fail if you tried
>> merge [4,5] []. because "4,5" isn't of type a.
>>
>> Regards, Hemanth
>>
>>
>> On Fri, May 18, 2018 at 10:51 AM trent shipley <trent.ship...@gmail.com>
>> wrote:
>>
>>> The below produces an error. And I am very proud that I could use the
>>> GHCi debugging tools to get this far.
>>>
>>> merge [] [] works.
>>>
>>> merge [1] [] works.
>>>
>>> I don't know why the failing example fails. It should return:
>>>
>>> [4,5]
>>>
>>> Help to unstuck is appreciated.
>>>
>>> :step merge [4,5] []
>>>
>>> *** Exception: ex6_8.hs:(12,1)-(16,66): Non-exhaustive patterns in
>>> function merge
>>>
>>> Given:
>>>
>>> merge :: Ord a => [a] -> [a] -> [a]
>>>
>>> merge [] [] = []
>>>
>>> merge [x] [] = [x]
>>>
>>> merge [] [y] = [y]
>>>
>>> merge first@(x:xs) second@(y:ys) | x <= y     = x : merge xs second
>>>
>>>                                  | otherwise  = y : merge first 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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: 
<http://mail.haskell.org/pipermail/beginners/attachments/20180518/e05638e0/attachment-0001.html>

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

Subject: Digest Footer

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


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

End of Beginners Digest, Vol 119, Issue 11
******************************************

Reply via email to