我对Elm和一般的FP都很新,但我对Haskell有一点经验。如果我没有在这里使用正确的术语,请原谅我。
我正在尝试做一些类似XSLT的事情,用XML替换模式将其转换为HTML。
我有一张图案和替换图。我不太确定最好的数据结构是什么,但我正在尝试类似的东西:
type alias Replacement = { pattern: String, replacement: String }
type ReplacementMap = List Replacement
replacementMap : ReplacementMap
replacementMap = [ { pattern: "<head>", replacement: "<h1>" },
{ pattern: "<lg>", replacement: "<ul>" },
{ pattern: "<l>", replacement: "<li>" } ]
然后我会做类似的事情:
type alias Xml = String
replacePat : Xml -> Html
replacePat pat repl = replace Regex.All (regex pat) (\_ -> repl)
用其HTML等价物替换XML标记head
,lg
和l
。我不知道该怎么做是迭代我的replacementMap
,用替换替换每个模式。或者也许有更好的方法完全这样做?
答案 0 :(得分:3)
首先,这是一个有效的例子:
import Html exposing (text)
import Regex as R
type alias Replacement = { pattern: R.Regex, replacement: String }
type alias ReplacementMap = List Replacement
type alias Xml = String
main =
let
replacements =
[ { pattern = R.regex "<head>", replacement = "<h1>" }
, { pattern = R.regex "</head>", replacement = "</h1>" }
, { pattern = R.regex "<lg>", replacement = "<ul>" }
, { pattern = R.regex "</lg>", replacement = "</ul>" }
, { pattern = R.regex "<l>", replacement = "<li>" }
, { pattern = R.regex "</l>", replacement = "</li>" }
]
example = "<head>Foo</head>"
in
text (replacePat example replacements)
replace : Replacement -> Xml -> Xml
replace replacement xml =
R.replace R.All replacement.pattern (always replacement.replacement) xml
replacePat : Xml -> ReplacementMap -> String
replacePat xml rmap =
List.foldl replace xml rmap
要解决问题首先考虑您的输入和输出:
INPUTS: List
替换模式和String
XML。
输出:String
HTML
如果你有一个集合,比如List
,你想得到一件事(例如String
)那就是你需要进行某种减少的线索:你将从多个变为一个。减少List
通常意味着您将进行折叠(foldl
或foldr
)。
foldr
遍历列表,将所提供的函数(在本例中为replace
)应用于列表中的项目以及应用该函数的先前结果;除了第一次迭代之外,在此期间使用起始值(在您的情况下为初始XML)。当迭代继续时,这会导致...连接效应。最后,函数的最后一次应用的结果将作为最终值返回。
换句话说,List.foldl replace xml rmap
与一堆嵌套函数应用程序(调用)相同:
replace
{ pattern = R.regex "<lg>", replacement = "<ul>" }
(replace
{ pattern = R.regex "</head>", replacement = "</h1>" }
(replace
{ pattern = R.regex "<head>", replacement = "<h1>" }
"<head>Foo</head>"))
......等等。