Concurrent Clean : 型クラス

使いかたに悩む。
これでは、うまく動かないのだよね。こういう場合ってどうすればいいんだろう?

class SQLConnOpen conn connProp where
    sqlOpen :: !String ![connProp] !*World -> (!PassFailSQL *conn, !*World)

class SQLConnection conn where
    sqlClose :: !*conn !*World -> (!MaybeFailSQL, !*World)

    sqlCommit :: !*conn -> (!MaybeFailSQL, !*conn)
    sqlRollback :: !*conn -> (!MaybeFailSQL, !*conn)
    sqlSetAutoCommit :: !Bool !*conn -> (!MaybeFailSQL, !*conn)

class SQLStmtOpen conn stmt stmtProp where
    sqlOpenStatement :: !String ![stmtProp] !*conn -> (!PassFailSQL *stmt, !*conn)

class SQLStmtClose conn stmt where
    sqlCloseStatement :: !*stmt !*conn -> (!MaybeFailSQL, !*conn)

class SQLStatement stmt where
    sqlBind :: ![SQLData] !*stmt -> (!MaybeFailSQL, !*stmt)
    sqlBindDouble :: !Int !Real !*stmt -> (!MaybeFailSQL, !*stmt)
    sqlBindInt    :: !Int !Int  !*stmt -> (!MaybeFailSQL, !*stmt)
    sqlBindText   :: !Int !String !*stmt -> (!MaybeFailSQL, !*stmt)
    sqlBindNull   :: !Int !*stmt -> (!MaybeFailSQL, !*stmt)

    sqlUpdate :: !*stmt -> (!PassFailSQL Int, !*stmt)

    sqlQuery :: !*stmt -> (!MaybeFailSQL, !*stmt)
    sqlFetch   :: !*stmt -> (!PassFailSQL Bool, !*stmt)
    sqlColumnCount :: !*stmt -> (!Int, !*stmt)
    sqlColumn :: !Int !*stmt -> (!String, !*stmt)
    sqlColumns :: !*stmt -> (!{!String}, !*stmt)
    sqlResult :: !Int !*stmt -> (!PassFailSQL SQLData, !*stmt)
    sqlResults :: !*stmt -> (!PassFailSQL {!SQLData}, !*stmt)