
I don't think this is publishable research, there is too much other stuff already out there. matt On 06/06/2005, at 5:58 PM, Gracjan Polak wrote:
Matthew Roberts wrote:
I have a project (for an early research student) waiting for an interested student to take on. It is called "Programming patterns for OO-like programming in Haskell". The basic idea is to identify how to achieve OO-like organisation of your code in vanilla haskell. Hopefully the student can come to a deep understanding of OO and haskell programming in the process.
If this could count as graduate student project and could spawn publication then I would be interested. :)
Sounds like exactly what you need. Shame no-one has taken it up yet. Perhaps next semester :) Anyone out there want to come to Sydney and take it on?
As I see you did not cc the list, so currently I'm the only one that received this message. :)
Matt On 06/06/2005, at 3:55 AM, Gracjan Polak wrote:
Cédric Paternotte wrote:
Hi. This is my first message here so Hello to everyone.
I'm just starting to learn Haskell and I really think it's a cool language.
Me too :)
I know OO and inheritance is not really the point of Haskell and that other mechanisms are provided to somewhat achieve reuse. But it's a way of programming I've been so used to that I feel lost without it. You might think I'm heading in the wrong direction. My mistake I have to agree. Let's take it as a learning exercise then.
Me too :)
5. With this : http://www.cs.utexas.edu/ftp/pub/techreports/tr01-60/tr01-60.pdf
I've been thinking about slight generalization of this lately. Here are my semi-backed thoughts as of now.
First of all, in Haskell there will be strict separation between interfaces and data, so almost every method will be declared twice. This is not so strange to anybody programing in Java, but for C++ programmers can be. Inheritance relation is specified after data. There is also separation between two concepts: what interfaces each piece of data implements and which intefaces given interface inherits. So:
{-# OPTIONS -fglasgow-exts -fallow-undecidable-instances #-}
module Main where
-- general inheritance relation class Inherits b x where get_super :: x -> b
-- declare interface with one method class IA a where get_a :: a -> Int
-- define data with one field data DA = DA { da_field :: Int }
-- say how data DA conforms to interface IA instance IA DA where get_a x = da_field x
-- declare some other interface IB -- note: IB is unrelated to IA class IB a where get_b :: a -> String
-- data that inherits fields of DA and adds one another field data DB = DB { db_super :: DA, db_field :: String }
-- DB inherits fields and methods of DA instance Inherits DA DB where get_super x = db_super x
-- data DB implements interface IB instance IB DB where get_b x = db_field x
-- some other random data data DC = DC { dc_super :: DA }
-- DC implements interface IB instance IB DC where get_b x = show (get_a x)
-- and inherits DA instance Inherits DA DC where get_super x = dc_super x
-- now the tricky part: state that every data x inheriting DA -- implements all interfaces of DA (repeat for each interface) instance (Inherits DA x) => IA x where get_a w = da_field (get_super w)
main = do let db = DB (DA 123) "zzz" let dc = DC (DA 123) putStrLn $ show (get_a db) putStrLn $ show (get_a dc) putStrLn $ show (get_b db) putStrLn $ show (get_b dc)
As you see there is much more writting as in Java. But this gives better control over inheritance and subsumption because everything must be stated explicitly. Multiple inheritance is allowed :) Also it is "private inheritance" (as in C++) by default.
There are some problems left: how to update a field? or how to make inheritance transitive. I don't know it yet :)
I guess my question now is this : Are there other ways to achieve inheritance in Haskell ?
Me too:)
My proposal (above) is about the level of 'OO' things done in procedural languages (example: C with GTK+ library). There must be a better way. Any comments?
-- Gracjan _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe