Временное пространство имен/контекст в Haskell

В Io вы можете установить контекст выполнения, используяdo:

Http := Object clone
Http get := method(uri, ("") println)
Http delete := method(uri, ("") println)

Database := Object clone
Database insert := method(table, data, ("") println)
Database delete := method(table, id, ("") println)

Http do(
  get("http://example.com/")
  delete("http://example.com/something")
)

Database do(
  insert("cats", list("Phil", "gray"))
  delete("cats", 12)
)

(Ruby имеет схожую функцию с Object#instance_exec, но его объектная модель немного сложнее.)

По сути, это дает вам временное пространство имен, которое удобно для написания доменных языков. Существует ли способ добиться подобного эффекта (для временного пространства имен )в Haskell?

Например, что-то вроде:(Не обязательно именно так, но что-то с таким же кратким синтаксисом.)

main = do
  http $ do
    get "http://example.com/"
    delete "http://example.com/something"
  database $ do
    insert "cats" ["Phil", "gray"]
    delete "cats" 12

Обратите внимание, что две delete— совершенно разные функции. Я бы предпочел не писать такие вещи, как H.deleteи D.delete, потому что это быстро приведет к путанице. Я понимаю, что этого можно было бы избежать, переименовав эту версию базы данных, например, в deleteFrom, но я этого не хочу.

15
задан Snowball 26 July 2012 в 03:50
поделиться