Haskellで関数を動的に定義する方法、またはHaskellの慣用的な同等物を探しています。
シナリオは次のとおりです。提供された引数tagWithAttrs
に基づいて新しい関数を生成する関数があります。String
定義は次のようになります。
tagWithAttrs :: String -> ([(String, String)] -> [String] -> String)
tagWithAttrs tagName = [...] -- Implementation ommited to save room.
h1 :: [(String, String)] -> [String] -> String
h1 = tagWithAttrs "h1"
main :: IO ()
main = putStrLn $ h1 [("id", "abc"), ("class", "def")] ["A H1 Test"]
-- Should display '<h1 id="abc" class="def">A H1 Test</h1>'.
ここまでは順調ですね。しかし、私が割り当てる行は、h1
私が定義しているすべてのHTMLタグに対してそれを行わなければならないので、多くの1つです。tag_with_attrs
Pythonでは、HTMLタグ名のリストをループして、から返された辞書にそれぞれの結果を挿入しglobals()
ます。つまり、シンボルテーブルに動的に新しいエントリを挿入します。
このイディオムのハスケル同等物は何ですか?
ところで、私はすでにHTMLタグを実行している多くの既存のライブラリの作業を複製していることを十分に認識しています。私はおもちゃのプロジェクトのためにこれをやっています、それ以上は何もありません:)
編集:いくつかの投稿されたソリューションは、最終結果タグ関数を1つずつ定義することに依然依存しているメカニズムを提案しています。これはDRYに違反します。そうでなければ、私はそれを自分のやり方でやったでしょう。私が回避しようとしているのは、そのDRY違反です。