Send Beginners mailing list submissions to
        [email protected]

To subscribe or unsubscribe via the World Wide Web, visit
        http://www.haskell.org/mailman/listinfo/beginners
or, via email, send a message with subject or body 'help' to
        [email protected]

You can reach the person managing the list at
        [email protected]

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


Today's Topics:

   1. Re:  expressing constraints 101 (akash g)


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

Message: 1
Date: Wed, 13 Aug 2014 12:53:44 +0530
From: akash g <[email protected]>
To: The Haskell-Beginners Mailing List - Discussion of primarily
        beginner-level topics related to Haskell <[email protected]>
Subject: Re: [Haskell-beginners] expressing constraints 101
Message-ID:
        <caliga_eb9oacbeozk5wkavggjz7uekcpy74+zlbluuqcv2z...@mail.gmail.com>
Content-Type: text/plain; charset="utf-8"

Hi Dimitri,

Did a bit of research  and found type families to be a good fit for this (
http://www.haskell.org/ghc/docs/latest/html/users_guide/type-families.html).
Type families lets us define the contraints (and a lot of other things)
when creating an instance.  I still do not know if this is the ideal
solution, but it is still a lot better than the previous solution that I
posted.

{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE TypeFamilies #-}
import GHC.Exts

class Set s where
  type C s a :: Constraint -- Here, the explicit type that we would have
given is turned into a type synonym of the kind Constraint, from GHC.Exts.
  empty         :: s a
  insert        :: (C s a) =>  a -> s a -> s a
  member        :: (C s a) => a -> s a -> Bool


data Tree a = Empty | MkTree (Tree a) a (Tree a)

treeEmpty :: Tree a
treeEmpty = Empty

treeInsert :: Ord a => a -> Tree a -> Tree a
treeInsert = undefined

treeMember :: Ord a => a -> Tree a -> Bool
treeMember = undefined

instance Set Tree where
  type C Tree a = Ord a -- Here, we are setting the type constraint to Ord
a, where a is again a type variable.
  empty  = treeEmpty
  member = treeMember
  insert = treeInsert


- Akash G





On Wed, Aug 13, 2014 at 11:41 AM, Dimitri DeFigueiredo <
[email protected]> wrote:

>  Hi G Akash,
>
> Is that the only solution? I thought about that. The problem with it is
> that it changes the Set type class. I want the Set type class to be able to
> contain elements of any type, not just members of Ord.
>
> I think the type class represents a "Set" interface that is general. It is
> the implementation using trees that is only available for Ordered types.
> And there may be other implementations that don't need this constraint. So,
> if possible, I don't want to change the Set type class. Isn't there another
> way to fix it?
>
>
> Thanks,
>
>
> Dimitri
>
>
> Em 12/08/14 23:18, akash g escreveu:
>
>  Hi Dimitri,
>
>  You can express the constraints as below
>
> class Set s where
>   empty  :: s a               -- returns an empty set of type Set of a
>   insert :: (Ord a) => a -> s a -> s a   -- returns set with new element
> inserted
>   member :: (Ord a) => a -> s a -> Bool  -- True if element is a member of
> the Set
>
>  This is because when you define tree as an instance of the typeclass
> 'Set', you don't match the constraints on the functions that the functions
> that it wants you to implement  That is, when you do:
>
>
> treeInsert :: Ord a => a -> Tree a -> Tree a
> treeInsert = undefined
>
> instance Set Tree where
>   empty  = treeEmpty
>   insert = treeInsert
>   member = treeMember
>
>  The type signature doesn't match when you do insert=treeInsert or
> member=treeMember, since you have
>
> class Set s where
>     insert :: a -> s a -> s a
>
>  Hope this helps
>
>  - G Akash
>
>
>
> On Wed, Aug 13, 2014 at 8:44 AM, Dimitri DeFigueiredo <
> [email protected]> wrote:
>
>> Hi All,
>>
>> I am working through an exercise in Chris Okasaki's book (#2.2). In the
>> book, he is trying to implement a minimal interface for a Set. I wrote that
>> simple interface in Haskell as:
>>
>> class Set s where
>>     empty  :: s a                -- returns an empty set of type Set of a
>>     insert :: a -> s a -> s a   -- returns set with new element inserted
>>     member :: a -> s a -> Bool  -- True if element is a member of the Set
>>
>> To implement that interface with the appropriately O(log n) insert and
>> member functions he suggests the use of a Binary Search Tree, which I
>> translated to Haskell as:
>>
>> data Tree a = Empty | MkTree (Tree a) a (Tree a)
>>
>> But for the tree to work, we also need the "a"s to be totally ordered.
>> I.e. (Ord a) is a constraint. So, it makes sense to write:
>>
>> treeEmpty :: Tree a
>> treeEmpty = Empty
>>
>> treeInsert :: Ord a => a -> Tree a -> Tree a
>> treeInsert = undefined
>>
>> treeMember :: Ord a => a -> Tree a -> Bool
>> treeMember = undefined
>>
>> Now, I would like to bind this implementation using Trees of an ordered
>> type "a" to the set type class. So, I would like to write something like:
>>
>> instance Set Tree where
>>     empty  = treeEmpty
>>     insert = treeInsert
>>     member = treeMember
>>
>> But that doesn't work. Using GHC 7.6.3, I get a:
>>
>>     No instance for (Ord a) arising from a use of `treeInsert'
>>     Possible fix:
>>       add (Ord a) to the context of
>>         the type signature for insert :: a -> Tree a -> Tree a
>>     In the expression: treeInsert a
>>     In an equation for `insert': insert a = treeInsert a
>>     In the instance declaration for `Set Tree'
>>
>> Which makes sense, but I'm not sure how to express this constraint.
>> So, what is the proper way to do this?
>> Where have I gone wrong?
>>
>>
>> Thanks!
>>
>> Dimitri
>>
>>
>>
>>
>>
>>
>> _______________________________________________
>> Beginners mailing list
>> [email protected]
>> http://www.haskell.org/mailman/listinfo/beginners
>>
>
>
>
> _______________________________________________
> Beginners mailing 
> [email protected]http://www.haskell.org/mailman/listinfo/beginners
>
>
>
> _______________________________________________
> Beginners mailing list
> [email protected]
> http://www.haskell.org/mailman/listinfo/beginners
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: 
<http://www.haskell.org/pipermail/beginners/attachments/20140813/184c21dd/attachment-0001.html>

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

Subject: Digest Footer

_______________________________________________
Beginners mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/beginners


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

End of Beginners Digest, Vol 74, Issue 6
****************************************

Reply via email to