В Io вы можете установить контекст выполнения с помощью do
:
Http := Object clone
Http get := method(uri, ("<GET request to " .. uri .. ">") println)
Http delete := method(uri, ("<DELETE request to " .. uri .. ">") println)
Database := Object clone
Database insert := method(table, data, ("<insert data to " .. table .. ">") println)
Database delete := method(table, id, ("<delete " .. id .. " from " .. table .. ">") 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
, но я не хочу.