我正在寻找一种在 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 标记都这样做。在 Python 中,我会遍历 HTML 标记名称列表,将每个相应tag_with_attrs
的结果从globals()
. 简而言之,我会动态地将新条目插入符号表中。
这个习语的 Haskell 等价词是什么?
顺便说一句,我完全意识到我正在复制许多已经完成 HTML 标记的现有库的工作。我正在为一个玩具项目做这个,仅此而已:)
编辑:一些已发布的解决方案建议仍然依赖于逐一定义最终结果标签功能的机制。这违反了 DRY,否则我会按照我的方式去做。这是我试图回避的 DRY 违规行为。