Tillmann Rendel wrote:
Andrew Coppin wrote:
[...] type (a,b) [...]

That's a rather special type; I haven't seen anything remotely like it in any other language.

This type isn't that special in Haskell (apart from being syntax-sugared), it could be defined as

  data Pair a b = Pair a b

The equivalent of this definition introduces pairs in other languages, too. Consider Java:

public class Pair<A, B> {
  public A fst;
  public B snd;
  public Pair(A fst, B snd) {
    this.fst = fst;
    this.snd = snd;
  }
}

OK, I don't even understand that syntax. Have they changed the Java language spec or something?


My point of course was that an array is a loop just as much as a list is.

No, it isn't. A loop has the following properties:

  (1) you can access only the current value
  (2) you can move only forward by computing some new current value

A (single linked) list has the following properties:

  (1) you can access only the current value
  (2) you can move only forward by following the next pointer

An array has the following properties:

  (1) you can access each value
  (2) you don't need to move around

In a lazy language, "following the next pointer" triggers "computing the new value", so loops are similar to lists, but different from arrays.

I just observe that in most programs, almost all looping constructs are to do with looping over *collections*, and it doesn't really matter what kind of collections they are...

Of course, you can loop over most collections, in the sense of repeatedly running some code for each element. This is expressed in Haskell in a bunch of type classes, most notably Functor.

Sadly, in Haskell you can't do that to "collections" that can only contain a specific type of element. I'm kinda hoping that Associated Types will fix this...?

Same goes for a set. Or even a dictionary (looping over key/value
pairs), whichever way it's implemented internally.

I take your "wichever way" to apply to all collections you mentioned. Let's consider this set representation:

  type Set a = a -> Bool

  dual a x = not (a x)
  member y a = a y
  notMember y a = dual a y
  empty y = False
  insert x a y = x == y || a y
  remove a x y = x /= y && a y
  union a b y = a y || b y
  intersection a b y = a y && b y
  difference a b = intersection a (dual b)
  filter = intersection

(Function names and their meaning is taken from Data.Set. a and b stands for sets, x and y for set elements and f for some function. the dual set is the set containing all elements except those in the original set)

What has a set represented like this in common with a loop?
I don't even understand that... :-S

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to