Chaddaï Fouché wrote:
You can indeed already do that, except it won't be a single instance
since list have a bucketful of interesting properties. A good starting
is looking at what list is an instance of and trying to identify the
set of instance which interest us in this case, Foldable and Functor
are probably a good start, embodying most of the interesting way to
access a data structure as a list (head and tail don't really make
sense for most of the alternatives, except other "sequence" library
which currently provide this functionality in an ad-hoc way, see
Sequence and ByteString for example of that).
An alternative is Traversable.
Thanks!
But before digging into this, maybe I should rephrase myself by giving a
more specific (although useless) example of what I mean.
When I write:
data Foo = Foo Int Int deriving (Show,Eq)
instance Num Foo where
fromInteger x = Foo x' x' where x' = fromInteger x
_ + _ = error "Not relevant for example"
_ * _ = error "Not relevant for example"
abs _ = error "Not relevant for example"
signum _ = error "Not relevant for example"
x = 42::Foo
I don't have to apply the Foo data constructor to lift the number 42
because I guess the compiler has builtin support for calling fromInteger
(or fromRational). I even don't have to add the type annotation most of
the time when the compiler can infer the type needed, which is very
cool, sometimes a bit annoying.
However, now I try the same for lists
data Bar = Bar [Int] [Int]
-- A List type class does not exist, so this cannot work
instance List Bar where
fromList x = Bar x x
-- This does not work
y = [1..10]::Bar
So the only way to do this, is to create a constructor function like
bar x = Bar x x
which means the usage of lists in Haskell is not as general as numbers,
in the sense one cannot take advantage of the builtin syntactic sugar of
lists like
[x,y,z] := x : (y : (z : []))
So if I would like to use this compact notation for e.g. creating a Set
datatype, I would have to create special constructor functions (fromList
or mkSet or whatever)
Is this correct? If so, I'm sure a good reason must exist for this :)
Thanks,
Peter
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe