Functional programming 在Elm中,如何迭代地图?

Functional programming 在Elm中,如何迭代地图?,functional-programming,elm,Functional Programming,Elm,我对Elm和FP都是新手,但我对Haskell有一点经验。如果我在这里使用的术语不正确,请原谅 我正在尝试做一些类似XSLT的事情,替换XML中的模式以将其转换为HTML 我有一张图案和替代品的地图。我不太确定这方面的最佳数据结构是什么,但我正在尝试以下方法: type alias Replacement = { pattern: String, replacement: String } type ReplacementMap = List Replacement replacementM

我对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)

将XML标记
head
lg
l
替换为它们的HTML等价物。我现在还不知道怎么做,就是迭代我的
replacementMap
,用它的替换替换每个模式。或者也许有更好的方法完全做到这一点

首先,这里有一个工作示例:

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

。。。等等。

您可以在替换地图上“List.map”。你的replacePat函数可以有一个类似“Xml->ReplacementMap->Html”的类型注释,我很难想象它是如何工作的。我如何跟踪XML在迭代每个替换对时的变化?
replace 
  { pattern = R.regex "<lg>", replacement = "<ul>" } 
  (replace 
     { pattern = R.regex "</head>", replacement = "</h1>" } 
     (replace 
        { pattern = R.regex "<head>", replacement = "<h1>" }                    
        "<head>Foo</head>"))