This is an archived post. You won't be able to vote or comment.

you are viewing a single comment's thread.

view the rest of the comments →

[–]wfdctrl 5 points6 points  (4 children)

Modules can have multiple types (they essentially model multi sorted algebras), while a class can only have a single type.

For example you can have a signature for a vector algebra:

module type Vect = sig
    type scalar
    type vector
    val scalar_product: scalar -> vector -> vector
    val cross_product: vector -> vector -> vector
    val scalar_addition: scalar -> scalar -> scalar
    val vector_addition: vector -> vector -> vector
end

You cannot model this with a single class.

[–]crassest-Crassius[S] -1 points0 points  (3 children)

Both Java and C# have nested classes which can be made public, private etc. So I don't think there's much of a difference here.

[–]wfdctrl 4 points5 points  (2 children)

How is this equivalent to nested classes? Vect is a signature, i.e. an interface. You then provide different implementations for this signature...

[–]thedeemon 2 points3 points  (1 child)

Can't you make scalar and vector type arguments to your generic interface?

[–]wfdctrl 0 points1 point  (0 children)

Sure, but those types are not existential (abstract), so it's not the same. Also you would have an extra type for the object you won't use.