[Haskell-cafe] lazily-loaded structures

Jeff Davis pgsql at j-davis.com
Fri Jan 1 17:17:09 EST 2010

I'm relatively new to haskell.

Let's say I have a simple program like this:

  import Data.Map

  type Tree = String
  type StringMap = Map String String

  f :: StringMap -> Tree -> Tree
  f _ y = y ++ "!"

  getStringMap :: IO StringMap
  getStringMap = return (Data.Map.fromList [("k1","v1")])

  main :: IO ()
  main = do
    m <- getStringMap
    s <- getLine
    putStr $ show (f m s) ++ "\n"

Ignore the implementation of f and getStringMap for now. Assume f is a
fairly complex function that uses the Map during the process of
transforming the Tree argument into the result Tree (here I defined Tree
as a string just so that it would compile).

getStringMap reads the whole Map into memory at once. However, now let's
say that the whole Map is too large, so I decide to store it over a
network in a remote database system instead. And then I define another
function like:

  type Connection = String
  getStringMapValue :: Connection -> String -> IO String

that takes a connection string and a key and returns the value.

My question is this: how do I change my program to make StringMap a
lazily-loaded structure based on getStringMapValue without changing f?

	Jeff Davis

More information about the Haskell-Cafe mailing list