
bf3@telenet.be wrote:
I'm learning Haskell. I was surprised that the following example did not compile:
data Vector2 = Vector2 { x :: Float, y :: Float } data Vector3 = Vector3 { x :: Float, y :: Float, z :: Float }
error: "Multiple declarations of `Main.x'"
AFAIK, GHC doesn't implement any fix for this. (I've been wrong before tho...) This is a feature, not a bug. Haskell in general does not let you give two functions the same name (which is what you want to do). This is
Andrew Coppin wrote: true of all functions, not just the ones implicitly defined here. Your "Vector2" type is pure syntactic sugar for: data Vector2 = Vector2 Float Float x, y :: Vector2 -> Float x (Vector2 v _) = v y (Vector2 _ v) = v So now you also want x (Vector3 v _ _) = v etc etc. And no, you can't do that because "x" on its own might refer to either version, and its not clear which one you want. Paul.