[Haskell-cafe] records proposals list

Wolfgang Jeltsch wolfgang at jeltsch.net
Mon Nov 21 08:41:26 EST 2005


Am Montag, 21. November 2005 13:37 schrieb Bulat Ziganshin:
> [...]

> > You should never use bad design to increase usability, I'd say.
>
> to be exact now i have the following definitions:

> [...]

> i prefer to replace second definition with the
>
> [...]
>     data CompressedFile : FileInfo = CompressedFile {
>         cfArcBlock :: ArchiveBlock [...],
>         cfPos :: FileSize [...],
>         cfCRC :: CRC [...]
>     }
>
> and then use procedures, written to work with FileInfo, to directly
> work with CompressedFile also. now my program is full of constructs
> like:
>
>   uiStartProcessing (map cfFileInfo (arcDirectory arcinfo))
>   let fileinfo  = cfFileInfo compressed_file
>
> and double-dereferencing about i wrote in previous letter. such change
> will allow me to omit all these superfluous code. imho, new design will
> be more natural and allow me to think about my algorithms instead of
> implementation complications

I would say, it's more natural because naturally we don't think as exactly as 
we should when programming.  A general file info and an info about compressed 
files are two different things, although related.  Allowing to silently use 
an info about compressed files where a general file info is expected, hides 
this difference and may, for example, result in the compiler not detecting 
certain errors which it otherwise would detect.

Another problem is that your inheritance approach only solves a rather 
restricted class of problems.  This is, in my opinion, a general problem with 
object-orientation.  OO just seems to not being well thought-out to me.  It 
seems that the inventors of OO just had a specific class of problems to solve 
in mind and then invented a system which is rather specific.  On the other 
hand, Haskell's type system, including several common extensions, is rather 
general and therefore more flexible.

What, for example, if you have two specific kinds of file infos A and B and 
also a kind of file info C which covers both A and B?  You need multiple 
inheritance.  But if you would declare a type C which inherits from A and B, 
you would also be allowed to add new fields.  But this is something you don't 
want since you just want to create the union of A's and B's fields.

In addition, with multiple inheritance you always have the question of whether 
you should inherit a common ancestor class of the superclasses more than once 
or not.  If you do "inheritance by hand" by writing something along the lines 
of

	data CompressedFileInfo = CompressedFileInfo {
		cfiFileInfo :: FileInfo,
		cfiArcBlock :: ArchiveBlock,
		cfiPos :: FileSize,
		cfiCRC :: CRC
	},

you already have all opportunities to decide how often you want to include a 
certain common superclass.

I have to admit that I didn't work with OO for quite some time so my thinkings 
about OO and similar things may be wrong.  But I could imagine that the whole 
inheritance concept is flawed, and I don't want to see flawed things in 
Haskell.  I always liked the fact that Haskell doesn't go the road of 
object-oriented programming where, as it seems to me, you have sometimes 
rather complicated rules which give you little flexibility.

Best wishes,
Wolfgang


More information about the Haskell-Cafe mailing list