|
|
|
|
|
|
| |
| |
|
|
|
|
| |
| |
|
|
How would you write this in Haskell?
struct Point {int x; int y;}
distance = sqrt(p.x*p.x + p.y*p.y);
Oh, right, Andrew doesn't know any C-like languages. Hmmm...
A "point" structure with an X and a Y element, and a distance function
that takes a point and calculates its distance from the origin.
Then, is it possible to add a Z element to the "Point" type without
having to rewrite the "distance" part? (Sure, it'll give the wrong
answer, but that's the point I'm trying to make with someone elsewhere
claiming strong typing avoids this sort of error.)
--
Darren New / San Diego, CA, USA (PST)
On what day did God create the body thetans?
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
Darren New wrote:
> How would you write this in Haskell?
>
> struct Point {int x; int y;}
data Point = Point {x, y :: Int}
Caution: Note that the names "x" and "y" must be unique within the
entire module. For this reason, you'd probably use longer names.
For something like this, a "typical" Haskell approach would "probably"
use unnamed fields:
data Point = Point Int Int
In either case, the following are all valid:
let p = Point 3 6 ...
my_function (Point x y) = ...
If the fields are named, you can also write
let p = Point {x=3, y=6} ...
let p = Point {y=6, x=3} ...
my_function p = ... x p ...
The expression "x p" is like the Pascal-style "p.x". (That is, "x" is a
function that takes a Point and yields its X coordinate.)
> distance = sqrt(p.x*p.x + p.y*p.y);
distance (Point x y) = sqrt (x*x + y*y)
> Then, is it possible to add a Z element to the "Point" type without
> having to rewrite the "distance" part? (Sure, it'll give the wrong
> answer, but that's the point I'm trying to make with someone elsewhere
> claiming strong typing avoids this sort of error.)
If you change the function to
distance p = sqrt (x p * x p + y p * y p)
then it will work with either of
data Point = Point {x, y :: Int}
data Point = Point {x, y, z :: Int}
If you're asking about having two seperate Point types in the same
program... that's another story.
Clear?
--
http://blog.orphi.me.uk/
http://www.zazzle.com/MathematicalOrchid*
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
Wouldn't povray.off-topic.fan.haskell.bork.bork.bork be a more
appropriate group? :)
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
Nicolas Alvarez <nic### [at] gmailisthebestcom> wrote:
> Wouldn't povray.off-topic.fan.haskell.bork.bork.bork be a more
> appropriate group? :)
huhuhuhuhu...
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
Orchid XP v7 <voi### [at] devnull> wrote:
> data Point = Point {x, y :: Int}
> Caution: Note that the names "x" and "y" must be unique within the
> entire module. For this reason, you'd probably use longer names.
Doesn't Haskell support encapsulation?
--
- Warp
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
Warp wrote:
> Orchid XP v7 <voi### [at] devnull> wrote:
>> data Point = Point {x, y :: Int}
>
>> Caution: Note that the names "x" and "y" must be unique within the
>> entire module. For this reason, you'd probably use longer names.
>
> Doesn't Haskell support encapsulation?
Define "encapsulation".
--
http://blog.orphi.me.uk/
http://www.zazzle.com/MathematicalOrchid*
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
Warp wrote:
> Doesn't Haskell support encapsulation?
Last time I checked, Java has the same limitation.
In a single Java class, all methods must have unique names. (Ignoring
for a moment the fact that Java supports overloading which Haskell
doesn't.) Similarly, in a Haskell module all function names must be unique.
Either way, you can't use the same name for multiple things in a single
source code file, in either language. And yet I don't see people
claiming that Java doesn't "support encapsulation". So I'm not sure what
you're getting at...
--
http://blog.orphi.me.uk/
http://www.zazzle.com/MathematicalOrchid*
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
> Warp wrote:
>
>> Doesn't Haskell support encapsulation?
>
> Last time I checked, Java has the same limitation.
>
> In a single Java class, all methods must have unique names. (Ignoring
> for a moment the fact that Java supports overloading which Haskell
> doesn't.) Similarly, in a Haskell module all function names must be unique.
>
> Either way, you can't use the same name for multiple things in a single
> source code file, in either language. And yet I don't see people
> claiming that Java doesn't "support encapsulation". So I'm not sure what
> you're getting at...
>
Without knowing a single thing about haskell, "module" *sounds* to me
like a Java package, not a class...
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
Nicolas Alvarez wrote:
> Without knowing a single thing about haskell, "module" *sounds* to me
> like a Java package, not a class...
Each Java class has to go into a separate source code file. Each Haskell
module has to go into a seperate source code file. Both languages
require unique names within a single source file file. ;-)
(And a Java "package" is really just a bunch of classes that have the
same prefix in their name, nothing more...)
--
http://blog.orphi.me.uk/
http://www.zazzle.com/MathematicalOrchid*
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
Invisible <voi### [at] devnull> wrote:
> Warp wrote:
> > Doesn't Haskell support encapsulation?
> Last time I checked, Java has the same limitation.
You said:
> > struct Point {int x; int y;}
>
> data Point = Point {x, y :: Int}
>
> Caution: Note that the names "x" and "y" must be unique within the
> entire module. For this reason, you'd probably use longer names.
I understand to mean that the names 'x' and 'y' in your code above
actually garbage the global namespace.
In the original C code they are local to 'Point' and do not affect
anything outside it.
--
- Warp
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |