[Haskell-beginners] Heterogeneous Lists

Frerich Raabe raabe at froglogic.com
Tue May 28 19:07:06 CEST 2013


On May 28, 2013, at 12:36 AM, harry <voldermort at hotmail.com> wrote:

> Every OO language which supports generics allows a declaration such as
> List<Show> alist, where Show is an interface. Any type implementing Show can
> be put in alist, and any Show operation can be performed on the alist's
> members. No casts, wrappers, or other special types and plumbing are needed.
> 
> Why isn't it possible to do this directly in Haskell?

My impression is that you often don't have this requirement, since functions are first-class values and you can treat them as closures. Consider this (silly) C++:

  struct Iface {
    // Yields the length of the printable representation of some object, plus some custom value.
    virtual int lengthPlus( int i ) = 0;
  };

  struct MyString : Iface {
    MyString( const std::string &s ) : m_s( s ) { }

    virtual int lengthPlus( int i ) {
      return m_s.size() + i;
    }

    std::string m_s;
  };

  struct MyBoolean : Iface {
    MyBoolean( bool b ) : m_b( b ) { }

    virtual int lengthPlus( int i ) {
      return m_b ? strlen( "True" ) + i
                 : strlen( "False" ) + i;
    }

    bool m_b;
  };

You could now have code like:

  std::list<Iface *> l;
  l.push_back( new MyString( "Sample" ) );
  l.push_back( new MyBoolean( true ) );
  std::list<Iface *>::const_iterator it, end = l.end();
  for ( it = l.begin(); it != end; ++it ) {
    std::cout << (*it)->lengthPlus( 4 );
  }

Now, in Haskell you wouldn't need the interface in the first place. You could use plain functions (I'm using slightly ugly naming here to show the parallels to the C++ code):

  MyString_lengthPlus :: String -> Int -> Int
  MyString_lengthPlus s i = length s + i

  MyBoolean_lengthPlus :: Bool -> Int -> Int
  MyBoolean_lengthPlus True i  = 4 + i
  MyBoolean_lengthPlus False i = 5 + i

  l :: [Int -> Int]
  l = [MyString_lengthPlus "Sample", MyBoolean True]

  print $ map ($ 4) l

Note how, just like in C++, the type of the actual value on which the 'map' in the last line works on is hidden at the moment the list 'l' is populated with values.


-- 
Frerich Raabe - raabe at froglogic.com
www.froglogic.com - Multi-Platform GUI Testing









More information about the Beginners mailing list