HOpenGL делает все в монаде IO. API, который он представляет, больше похож на OpenGL, чем на Haskell. Например,
do
-- create a new display list
dl <- defineNewList $ do
-- put some
-- drawing code
-- in here
-- call a pre-defined display list
callList dl
Таким образом, все низкоуровневые взаимодействия OpenGL do в конечном итоге становятся очень полными.