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
2つは完全に異なる機能であることに注意してください。H.delete
やのようなものを書くのは避けたいと思いD.delete
ます。そうするとすぐに面倒になるからです。そのデータベースバージョンの名前をたとえばに変更することでこれを回避できることはわかっていますdeleteFrom
が、そうしたくありません。